PHP được thiết kế [hay đúng hơn là phát triển] để sử dụng với các yêu cầu web, nơi bạn thường xuyên xử lý đầu vào chuỗi [tham số URL hoặc yêu cầu POST từ một biểu mẫu trong trình duyệt]. Như vậy nó sẽ tự cast string sang các kiểu khác
Một ví dụ đơn giản về điều này là
Fatal error: Null can not be used as a standalone type in .. on line ...
Fatal error: False can not be used as a standalone type in .. on line ...
4 đưa ra Fatal error: Null can not be used as a standalone type in .. on line ...
Fatal error: False can not be used as a standalone type in .. on line ...
5, không phải lỗi, hoặc Fatal error: Null can not be used as a standalone type in .. on line ...
Fatal error: False can not be used as a standalone type in .. on line ...
6', hoặc một số cách diễn giải khác. Theo logic tương tự, chuỗi Fatal error: Null can not be used as a standalone type in .. on line ...
Fatal error: False can not be used as a standalone type in .. on line ...
7 có thể được sử dụng làm số Fatal error: Null can not be used as a standalone type in .. on line ...
Fatal error: False can not be used as a standalone type in .. on line ...
8Trong khi đó, giống như nhiều ngôn ngữ, PHP coi một số giá trị nhất định là "giả" khi chuyển thành boolean - những giá trị "trống rỗng" theo trực giác, như bạn nói. Điều đó bao gồm số
Fatal error: Null can not be used as a standalone type in .. on line ...
Fatal error: False can not be used as a standalone type in .. on line ...
8, cũng như chuỗi rỗng function foo[]: null {}
function bar[]: false {}
0 và mảng trống function foo[]: null {}
function bar[]: false {}
1. Trong một câu lệnh function foo[]: null {}
function bar[]: false {}
2, biểu thức rõ ràng được chuyển thành boolean, vì vậy function foo[]: null {}
function bar[]: false {}
3 giống như Fatal error: Null can not be used as a standalone type in .. on line ...
Fatal error: False can not be used as a standalone type in .. on line ...
50Đặt hai điều này lại với nhau, bạn sẽ có một câu hỏi hóc búa. một mặt, như bạn nói
Fatal error: Null can not be used as a standalone type in .. on line ...
Fatal error: False can not be used as a standalone type in .. on line ...
7 là một chuỗi không trống; . PHP chọn coi "tính không" quan trọng hơn "tính chặt chẽ", do đó, Fatal error: Null can not be used as a standalone type in .. on line ...
Fatal error: False can not be used as a standalone type in .. on line ...
7 được coi là "giả"PHP8. 0 đã thêm hỗ trợ cho Các loại kết hợp, giúp có thể khai báo một loại dưới dạng kết hợp của hai hoặc nhiều loại. Nó cho phép
function foo[]: null {}
function bar[]: false {}
8 và function foo[]: null {}
function bar[]: false {}
9 là các loại có thể cho Loại Liên minh, nhưng không cho phép sử dụng chúng làm loại độc lậpTrước PHP 8. 2, chỉ có thể sử dụng
function foo[]: null {}
function bar[]: false {}
9 và function foo[]: null {}
function bar[]: false {}
8 như một phần của Loại liên kếtfunction foo[]: string|null {}
function strpos[]: int|false {}
Cố gắng sử dụng loại
function foo[]: null {}
function bar[]: false {}
9 hoặc function foo[]: null {}
function bar[]: false {}
8 làm loại độc lập [i. e mà không phải là một phần của loại liên kết] dẫn đến lỗi nghiêm trọng trong thời gian biên dịch trong các phiên bản PHP PHP 8. 0 và PHP8. 1function foo[]: null {}
function bar[]: false {}
Fatal error: Null can not be used as a standalone type in .. on line ...
Fatal error: False can not be used as a standalone type in .. on line ...
Trong PHP8. 2 trở lên, cho phép sử dụng
function foo[]: null {}
function bar[]: false {}
9 và function foo[]: null {}
function bar[]: false {}
8 làm loại độc lập. Đoạn mã dẫn đến lỗi nghiêm trọng ở trên không còn đưa ra bất kỳ lỗi nào trong PHP 8. 2 trở lên. Điều này làm cho hệ thống kiểu của PHP trở nên biểu cảm và đầy đủ hơn để có thể khai báo chính xác các kiểu trả về, tham số và thuộc tínhHơn nữa, PHP 8. 2 trở lên cho phép sử dụng Loại kết hợp với
function foo[]: null {}
function bar[]: false {}
8, điều này dẫn đến lỗi trong các phiên bản PHP cũ hơnCác hàm và phương thức PHP phải sử dụng nhận xét PHPDoc để cung cấp thông tin loại chính xác có thể trực tiếp khai báo loại trong chính hàm đó
class AnonUser extends User {
- /**
- * @return false
- */
- public function isAdmin[]: bool {
+ public function isAdmin[]: false {
return false;
}
}
Phân biệt giữa các loại trả về function foo[]: null {}
function bar[]: false {}
9 và function foo[]: null {}
function bar[]: false {}
9
function foo[]: null {}
function bar[]: false {}
function foo[]: null {}
function bar[]: false {}
Lưu ý rằng các hàm được khai báo với kiểu trả về
function foo[]: null {}
function bar[]: false {}
9 phải rõ ràng là Fatal error: Null can not be used as a standalone type in .. on line ...
Fatal error: False can not be used as a standalone type in .. on line ...
2, nếu không lệnh gọi hàm dẫn đến ngoại lệ Fatal error: Null can not be used as a standalone type in .. on line ...
Fatal error: False can not be used as a standalone type in .. on line ...
3. Các hàm không trả về giá trị một cách rõ ràng, do hoàn toàn không có câu lệnh Fatal error: Null can not be used as a standalone type in .. on line ...
Fatal error: False can not be used as a standalone type in .. on line ...
4 hoặc bằng cách bỏ qua giá trị trả về [Fatal error: Null can not be used as a standalone type in .. on line ...
Fatal error: False can not be used as a standalone type in .. on line ...
5] có thể tiếp tục sử dụng loại function foo[]: null {}
function bar[]: false {}
9 làm loại trả vềVí dụ sau đưa ra một ngoại lệ
Fatal error: Null can not be used as a standalone type in .. on line ...
Fatal error: False can not be used as a standalone type in .. on line ...
3 vì lẽ ra nó phải được khai báo với kiểu function foo[]: null {}
function bar[]: false {}
9 thay vì kiểu trả về function foo[]: null {}
function bar[]: false {}
9function foo[]: null {}
function bar[]: false {}
3____14Trừ khi
function foo[]: null {}
function bar[]: false {}
9 là kiểu trả về, khai báo hàm với kiểu trả về function foo[]: null {}
function bar[]: false {}
9 hoặc class AnonUser extends User {
- /**
- * @return false
- */
- public function isAdmin[]: bool {
+ public function isAdmin[]: false {
return false;
}
}
2 là cách tiếp cận phù hợp hơnNullability trong loại function foo[]: null {}
function bar[]: false {}
9
function foo[]: null {}
function bar[]: false {}
Nếu một loại được khai báo là
function foo[]: null {}
function bar[]: false {}
9, thì nó không thể được đánh dấu là "không có giá trị" bằng cú pháp class AnonUser extends User {
- /**
- * @return false
- */
- public function isAdmin[]: bool {
+ public function isAdmin[]: false {
return false;
}
}
5, vì nó dẫn đến một khai báo loại dư thừa. PHP ném lỗi vào thời gian biên dịch nếu nó gặp lỗifunction foo[]: null {}
function bar[]: false {}
8function foo[]: null {}
function bar[]: false {}
9Thay đổi liên quan
- PHP8. 0. Các loại liên minh
- PHP8. 0. Cảnh báo chức năng nội bộ hiện ném ngoại lệ
3 vàFatal error: Null can not be used as a standalone type in .. on line ... Fatal error: False can not be used as a standalone type in .. on line ...
7class AnonUser extends User { - /** - * @return false - */ - public function isAdmin[]: bool { + public function isAdmin[]: false { return false; } }
- PHP8. 1. Các loại giao lộ
- PHP8. 1. loại
2class AnonUser extends User { - /** - * @return false - */ - public function isAdmin[]: bool { + public function isAdmin[]: false { return false; } }
- PHP8. 2. loại
9class AnonUser extends User { - /** - * @return false - */ - public function isAdmin[]: bool { + public function isAdmin[]: false { return false; } }
Tác động tương thích ngược
Trước PHP 8. 2, không được phép sử dụng
function foo[]: null {}
function bar[]: false {}
9 và function foo[]: null {}
function bar[]: false {}
8 làm loại độc lập. PHP8. 2 trở lên cho phép chúng dưới dạng các loại độc lập và điều này sẽ không gây ra bất kỳ sự cố tương thích nào trong các phiên bản PHP cũ hơn