Hàm PHP trả về kiểu hỗn hợp

Các giá trị luôn là một chuỗi array. Hãy chịu đựng các chuỗi và làm việc với loại array

Nếu đó là sự thật, những điều này không thể xảy ra

$sweetPromise = new SweetPromise();
echo $sweetPromise->getValues(); // null or array?

$sweetPromise->setValues('{55}'); // string or array?
echo $sweetPromise->getValues(); // string or array?

Chúng tôi không có ý tưởng về giá trị chúng tôi đưa vào. Chúng tôi không thể đưa ra bất kỳ giả định nào trừ khi chúng tôi sẵn sàng mạo hiểm loại lỗi và xác minh thủ công từng loại

Bộ lọc trung thực sẽ hiển thị lớp trên như thế này

class SweetPromise
{
    private $values;

    public function setValues($values)
    {
        $this->values = $values;
    }

    public function getValues()
    {
        return $this->values;
    }
}

Bây giờ rõ ràng là chúng ta không thể tin vào docblocks. Chủ yếu là do các loại docblock không dựa trên mã thực tế mà dựa trên trạng thái lý tưởng = nếu mọi phương thức đều đáng tin cậy 100%, được gọi theo thứ tự được xác định chính xác và với các biến đầu vào được nhập đáng tin cậy 100%. Mà họ không

Hàng triệu dòng với Docblocks

giọng này hơi buồn. Vậy chúng ta có thể làm gì nếu có hàng triệu dòng mã với docblocks?

Chúng tôi có một vài lựa chọn

  • đi từng dòng một, cố gắng phát hiện mẫu và thêm khai báo loại nghiêm ngặt, đơn đầu tiên
  • sau đó truyền loại này tới tất cả các cuộc gọi của mã này
  • mạo hiểm chuyển đổi khối tài liệu tự động và để người dùng thực hiện thử nghiệm;
  • đi với một số loại

"Một số loại" là gì?

Một số loại dựa trên các giá trị thực tế, hoạt động và cấu trúc logic mà trong bất kỳ trường hợp nào luôn có chính xác một loại

  • giá trị vô hướng chính xác
  • các giá trị dựa trên các hàm bên trong PHP
  • kết quả của toán tử nhị phân
    • $anything && $somethingElse luôn trả về bool
    • $sweetPromise = new SweetPromise();
      echo $sweetPromise->getValues(); // null or array?
      
      $sweetPromise->setValues('{55}'); // string or array?
      echo $sweetPromise->getValues(); // string or array?
      0 luôn trả về
      $sweetPromise = new SweetPromise();
      echo $sweetPromise->getValues(); // null or array?
      
      $sweetPromise->setValues('{55}'); // string or array?
      echo $sweetPromise->getValues(); // string or array?
      1
    • $sweetPromise = new SweetPromise();
      echo $sweetPromise->getValues(); // null or array?
      
      $sweetPromise->setValues('{55}'); // string or array?
      echo $sweetPromise->getValues(); // string or array?
      2 luôn trả về bool

Không chỉ các giá trị một dòng mà cả các cấu trúc phức tạp hơn như mảng được tạo và điền

function provideDreams()
{
    $dreams = [];

    foreach ($this->dreamRepository->fetchAll() as $dream) {
        $dreams[] = $dream;
    }

    return $dreams;
}

Mã này luôn trả về _______13_______, bất kể _______ 0_______5 thực sự là gì

Dựa vào 4 quy tắc này, chúng ta có thể hoàn thành các loại sau một cách chắc chắn 100%

 final class Reality
 {
-    public function getAge()
+    public function getAge(): int
     {
         return 100;
     }

-    public function removeTax(int $value)
+    public function removeTax(int $value): int
     {
         return $value - 200;
     }

-    public function transform($value)
+    public function transform($value): string
     {
         if ($value === null) {
             return '';
         }

         return base64_encode($value);
    }
}

Và nhiều hơn nữa

Tùy thuộc vào độ tuổi của dự án của bạn, có một yêu cầu để thực hiện công việc này. Bạn phải sử dụng PHP 7. 0, nơi đã được thêm vào

Tự mình thử

Hiệu trưởng có thể xử lý một số trường hợp trên trong phiên bản cơ bản. Thêm các quy tắc này vào mã của bạn và tự mình xem

________số 8_______

Chạy Hiệu trưởng và xem có bao nhiêu loại mới đã được thêm vào. Trong dự án mà chúng tôi đã thử nghiệm các quy tắc này, chúng tôi đã thay đổi hơn 40 tệp trong lần chạy đầu tiên. Từ 0 đến 40 tệp, khá ấn tượng. Và như bạn đã biết, các loại nghiêm ngặt lan truyền theo cấp số nhân

Đến trong Hiệu trưởng Doanh nghiệp

Phần còn lại của các trường hợp và hơn thế nữa sẽ được đề cập trong các quy tắc của phiên bản Rector Enterprise sắp tới, với nhiều quy tắc và tính năng bổ sung hơn theo giấy phép trả phí riêng

Trong PHP 7, một tính năng mới, Khai báo kiểu trả về đã được giới thiệu. Khai báo kiểu trả về xác định kiểu giá trị mà một hàm sẽ trả về. Các loại sau cho các loại trả về có thể được khai báo

  • int
  • trôi nổi
  • bool
  • chuỗi
  • giao diện
  • mảng
  • gọi được

Ví dụ - Loại trả về hợp lệ

Nó tạo ra đầu ra trình duyệt sau -

5

Ví dụ - Loại trả về không hợp lệ

Nó tạo ra đầu ra trình duyệt sau -

Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...

Hàm PHP có thể trả về nhiều giá trị không?

Một hàm không thể trả về nhiều giá trị , nhưng có thể thu được kết quả tương tự bằng cách trả về một mảng.

Làm cách nào để xác định kiểu trả về của hàm trong PHP?

Khai báo kiểu trả về PHP . Để khai báo kiểu trả về của hàm, hãy thêm dấu hai chấm (. ) và nhập ngay trước dấu ngoặc nhọn ( { ) khi khai báo hàm .

Làm cách nào để trả về nhiều mảng từ hàm trong PHP?

PHP không hỗ trợ trả về nhiều giá trị trong một hàm . Bên trong một hàm khi câu lệnh return đầu tiên được thực thi, nó sẽ điều khiển trực tiếp trở lại hàm gọi và câu lệnh return thứ hai sẽ không bao giờ được thực thi.

PHP 8 có được gõ tĩnh không?

PHP 8. 0 cho phép tĩnh làm kiểu trả về cho các phương thức của lớp . Các phương thức lớp PHP có thể trả về bản thân và cha mẹ trong các phiên bản trước, nhưng tĩnh không được phép trong các phiên bản PHP trước 8. 0. Kiểu trả về tĩnh mới được phép cho phép thu hẹp kiểu trả về thành lớp được gọi.