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 executeMộ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: //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 returnkhô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 allowedNhư 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