Câu trả lời:
PHP 7.1 hoặc mới hơn (phát hành ngày 2 tháng 12 năm 2016)
Bạn có thể khai báo rõ ràng một biến null
theo cú pháp này
function foo(?Type $t) {
}
điều này sẽ dẫn đến
$this->foo(new Type()); // ok
$this->foo(null); // ok
$this->foo(); // error
Vì vậy, nếu bạn muốn một đối số tùy chọn, bạn có thể tuân theo quy ước Type $t = null
trong khi nếu bạn cần làm cho một đối số chấp nhận cả hai null
và loại của nó, bạn có thể làm theo ví dụ trên.
Bạn có thể đọc thêm ở đây .
PHP 7.0 trở lên
Bạn phải thêm một giá trị mặc định như
function foo(Type $t = null) {
}
Bằng cách đó, bạn có thể vượt qua nó một giá trị null.
Điều này được ghi lại trong phần trong tài liệu hướng dẫn về Tuyên bố Loại :
Khai báo có thể được thực hiện để chấp nhận
NULL
các giá trị nếu giá trị mặc định của tham số được đặt thànhNULL
.
function foo(Type $t)
một điều RẤT tốt; xem Tài liệu tham khảo Null: Sai lầm tỷ đô
Bắt đầu từ PHP 7.1, các kiểu nullable đều có sẵn, vì cả hai kiểu trả về hàm và tham số. Loại ?T
có thể có các giá trị của Loại được chỉ định T
, hoặc null
.
Vì vậy, chức năng của bạn có thể trông như thế này:
function foo(?Type $t)
{
}
Ngay khi bạn có thể làm việc với PHP 7.1, ký hiệu này sẽ được ưu tiên hơn function foo(Type $t = null)
bởi vì nó vẫn buộc người gọi xác định rõ ràng một đối số cho tham số $t
.
Như các câu trả lời khác đã được đề cập, điều này chỉ có thể nếu bạn chỉ định null
làm giá trị mặc định.
Nhưng giải pháp hướng đối tượng an toàn loại sạch nhất sẽ là NullObject :
interface FooInterface
{
function bar();
}
class Foo implements FooInterface
{
public function bar()
{
return 'i am an object';
}
}
class NullFoo implements FooInterface
{
public function bar()
{
return 'i am null (but you still can use my interface)';
}
}
Sử dụng:
function bar_my_foo(FooInterface $foo)
{
if ($foo instanceof NullFoo) {
// special handling of null values may go here
}
echo $foo->bar();
}
bar_my_foo(new NullFoo);
NullFoo
phải ghi đè các phương thức trừu tượng, mặc dù chúng không có ý nghĩa (theo định nghĩa null
).
if (something is null)
kiểm tra, vì NullObject có nghĩa là bao gồm tất cả các hành vi của một giá trị không tồn tại và bất kỳ cộng tác viên bên ngoài nào cũng không cần phải quan tâm đến việc đối tượng không tồn tại (null) hay không.