Відповіді:
PHP 7.1 або новішої версії (випущено 2 грудня 2016 року)
Ви можете явно оголосити змінну null
такою синтаксисом
function foo(?Type $t) {
}
це призведе до
$this->foo(new Type()); // ok
$this->foo(null); // ok
$this->foo(); // error
Отже, якщо ви хочете необов'язковий аргумент, ви можете слідувати умові, Type $t = null
тоді як якщо вам потрібно зробити аргумент, прийміть і те, і іншеnull
і його тип, ви можете слідувати вищенаведеному прикладу.
Більше ви можете прочитати тут .
PHP 7.0 або новіші
Ви повинні додати значення за замовчуванням, як-от
function foo(Type $t = null) {
}
Таким чином, ви можете передати це нульове значення.
Це задокументоване у розділі посібника про Декларації типів :
Декларація може бути прийнята для прийняття
NULL
значень, якщо для параметра за замовчуванням встановлено значенняNULL
.
function foo(Type $t)
, це ДУЖЕ хороша річ; див. Null References: Помилка
Починаючи з PHP 7.1, доступні зведені типи , як обидва, так і параметри повернення. Тип ?T
може мати значення вказаного типу T
, або null
.
Отже, ваша функція може виглядати приблизно так:
function foo(?Type $t)
{
}
Як тільки ви зможете працювати з PHP 7.1, це позначення слід function foo(Type $t = null)
віддати перевагу , оскільки воно все ж змушує абонента чітко вказати аргумент для параметра $t
.
Як і інші відповіді, про які вже говорилося, це можливо лише в тому випадку, якщо ви вказали null
як значення за замовчуванням.
Але найчистішим безпечним для об'єктів орієнтованим на рішення рішенням буде 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)';
}
}
Використання:
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
переосмислити абстрактні методи, хоча вони не мають значення (за визначенням null
).
if (something is null)
перевірок, оскільки NullObject призначений для покриття будь-якої поведінки неіснуючого значення, а будь-який зовнішній співпрацівник не повинен бути зацікавлений у тому, чи об'єкт не існує (нульовий) чи ні.