Loại PHP không bao giờ trả về là gì?

Không, đây không phải là một mối đe dọa. đây chỉ là lời giải thích về kiểu không bao giờ trả về mới được giới thiệu trong PHP 8. 1


Ừm, cái gì?

Bình tĩnh. Hãy thử chứng minh vấn đề nào chúng ta có thể giải quyết với loại không bao giờ trả lại này

Giả sử, trong ứng dụng của chúng tôi, chúng tôi có một phương thức chỉ đưa ra một ngoại lệ, không trả về bất kỳ thứ gì tương tự. Nó chỉ chuẩn bị ngoại lệ thích hợp và ném nó

Nhưng tại sao chúng ta lại tạo một phương thức chỉ để ném ngoại lệ? . Thông báo ngoại lệ tự giải thích thích hợp có thể rất hữu ích trong quá trình gỡ lỗi. Và để chuẩn bị thư có định dạng tốt, bạn có thể cần thực hiện một số xử lý xứng đáng với phương pháp chuyên dụng

<?php

class SomeClass
{
  function ensureUserHasPermission(User $user, Action $action): void
  {
      if($user->hasPermission($action) === false){
          userHasNoPermission($user, $action);
      }
  }
  
  function userHasNoPermission(User $user, Action $action)
  {
     if(config('environment') === 'production'){
        /*
        * here we can have some logic related to production
        * maybe some extensive logging for later debug 
        */
     }

     /*
     * here we can have some logic related to dev/testing
     * maybe some dev friendly message, eg. how to allow permission
     */
  }
}

Ở trên, chúng tôi có phương thức ensureUserHasPermission() chỉ kiểm tra xem người dùng có quyền thích hợp cho hành động hay không. Nếu hasPermission() trả về false, điều đó có nghĩa là người dùng không có quyền, trong trường hợp đó, nó gọi userHasNoPermission( . Bạn có thể nhận thấy, chúng tôi không muốn tiếp tục ứng dụng của mình khi người dùng không có quyền, vì vậy . You may have notice, we do not want to continue our app when user does not have permission, so userHasNoPermission() sẽ là điều cuối cùng được thực thi. Chúng tôi có thể đưa ra một số ngoại lệ ở đây, thậm chí chúng tôi có thể gọi die()/exit()

Bây giờ, hãy để tôi hỏi bạn một câu hỏi, "Phương thức userHasNoPermission() nên có kiểu trả về nào?". Bạn có thể nghĩ về kiểu trả về void, nhưng void chỉ có nghĩa là hàm không trả về gì cả. void không có nghĩa là phương thức đó dừng quá trình PHP bởi lệnh gọi ngoại lệ/chết/thoát.

Trên thực tế, PHP không có bất kỳ kiểu trả về thích hợp nào để xác định hành vi này, cho đến bây giờ


Đúng, phương thức đó sẽ không bao giờ trả về kiểu

function userHasNoPermission(User $user, Action $action): never
{
    // die or exit
}

không bao giờ có nghĩa là một khi chúng ta gọi phương thức này, quá trình PHP sẽ bị dừng bởi nó. Vì vậy, sẽ không có mã nào được xử lý sau khi gọi phương thức này

echo 'a';
methodThatHasNeverReturnType(); // php will be stopped here
echo 'b'; // this line will not execute


Một ví dụ khác là khi chúng ta có một phương thức chuyển hướng đến url

function redirectToLogin(): never
{
    header('location: https://site.com/login');
    exit;
}

Phương pháp này chỉ cần chuyển hướng và sau đó thoát. Phương thức này sẽ không bao giờ trả về kiểu


Nếu một phương thức chưa bao giờ trả về kiểu, chúng ta có thể trả về thứ gì đó từ nó không?

Không, bạn không thể. phương thức chứa kiểu không bao giờ trả lại không thể trả lại bất cứ thứ gì

function foo(): never
{
    return 'something'; // will throw TypeError

    return; // will not work either.
}


Điều gì xảy ra nếu tôi không dừng tiến trình PHP bên trong phương thức never?

phương thức không bao giờ được khai báo phải ném ngoại lệ hoặc gọi die/exit. Nếu không, PHP sẽ ném TypeError

function foo(): never
{
   echo "something";
}

foo(); // Uncaught TypeError: foo(): never-returning function must not implicitly return


không bao giờ chỉ có thể được sử dụng làm kiểu trả về

Chúng tôi không thể sử dụng never làm loại thuộc tính/tham số. chúng tôi cũng không thể sử dụng nó trong loại công đoàn. không bao giờ phải được xác định chỉ trong kiểu trả về hàm


Khi mở rộng một lớp

class Foo
{
    function redirect(): never{}
}

class FooBar extends Foo
{
    function redirect(): string{}
}
// Declaration of FooBar::redirect(): string must be compatible with Foo::redirect(): never

//however, we can change other return type to never
class Foo
{
    function redirect(): string{}
}

class FooBar extends Foo
{
    function redirect(): never{}
}
// this is allowed



Như bạn có thể thấy, mặc dù các trường hợp sử dụng kiểu không bao giờ trả về bị hạn chế, bổ sung mới này cho hệ thống kiểu PHP vẫn khá tiện dụng

Kiểu trả về trong PHP là gì?

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 loại giá trị mà hàm sẽ trả về . Các loại sau cho các loại trả về có thể được khai báo. trôi nổi. bool.

Kiểu trả về void trong PHP là gì?

Kiểu trả về void đã được giới thiệu. Các hàm được khai báo với kiểu trả về void phải bỏ hoàn toàn câu lệnh return hoặc sử dụng câu lệnh return rỗng . null không phải là giá trị trả về hợp lệ cho hàm void.

Làm cách nào để trả về giá trị null trong PHP?

Kể từ PHP 7. 1, bạn có thể chỉ định loại trả về nullable với dấu chấm hỏi ở phía trước loại trả về . Điều này có nghĩa là bạn có thể trả về một số nguyên hoặc một giá trị null. Lưu ý rằng không trả lại bất cứ thứ gì về mặt kỹ thuật cũng có nghĩa là trả về giá trị null.

Làm cách nào để đặt 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 .