Не удается передать аргумент null при использовании подсказки типа


следующий код:

<?php

    class Type {

    }

    function foo(Type $t) {

    }

    foo(null);

?>

ошибка во время выполнения:

PHP Fatal error:  Argument 1 passed to foo() must not be null

почему не разрешается передавать null так же, как и другие языки?

4 118

4 ответа:

вы должны добавить значение по умолчанию, как

function foo(Type $t = null) {

}

таким образом, вы можете передать его нулевое значение.

это описано в разделе руководства о Заявления Типа:

заявление может быть сделано, чтобы принять NULL значения, если для параметра по умолчанию установлено значение NULL.

из PHP 7.1 (выпущен 2 декабря 2016 года), вы можете явно объявить переменную, чтобы быть null этот синтаксис

function foo(?Type $t) {
}

в результате

$this->foo(new Type()); // ok
$this->foo(null); // ok
$this->foo(); // error

Итак, если вы хотите необязательный аргумент, вы можете следовать в то время как если вам нужно сделать аргумент принять оба null и его тип, вы можете следовать выше примере.

вы можете подробнее здесь.

начиная с PHP 7.1, типы nullable доступны как типы возвращаемых функций, так и параметры. Тип ?T может иметь значения указанного типа T или null.

Итак, ваша функция может выглядеть так:

function foo(?Type $t)
{

}

как только вы можете работать с PHP 7.1, эта нотация должна быть предпочтительнее function foo(Type $t = null), потому что это все еще заставляет вызывающего абонента явно указывать аргумент для параметра $t.

попробуй:

function foo(Type $t = null) {

}

проверить аргументы функции PHP.

как уже упоминалось в других ответах, это возможно только при указании 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);