Nie można przekazać argumentu null podczas używania podpowiedzi typu

Następujący kod:

<?php

    class Type {

    }

    function foo(Type $t) {

    }

    foo(null);

?>

Nie powiodło się w czasie wykonywania:

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

Dlaczego nie można przekazać null tak jak w innych językach?

Author: Mark Amery, 2013-01-29

4 answers

Musisz dodać wartość domyślną jak

function foo(Type $t = null) {

}

W ten sposób możesz przekazać mu wartość null.

Jest to udokumentowane w sekcji podręcznika o deklaracjach typu :

Deklaracja może przyjąć wartości NULL, Jeśli wartość domyślna parametru jest ustawiona na NULL.

Od PHP 7.1 (wydany 2 grudnia 2016) możesz jawnie zadeklarować zmienną jako null za pomocą tej składni

function foo(?Type $t) {
}

To spowoduje w

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

Więc, jeśli chcesz opcjonalnego argumentu, możesz postępować zgodnie z konwencją Type $t = null, podczas gdy jeśli chcesz, aby argument zaakceptował zarówno null, jak i jego typ, możesz postępować zgodnie z powyższym przykładem.

Możesz przeczytać więcej tutaj .

 213
Author: DonCallisto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-22 05:43:34

Zaczynając od PHP 7.1, typy nullable są dostępne, zarówno jako typy zwracania funkcji, jak i parametry. Typ ?T może mieć wartości określonego typu T lub null.

Więc twoja funkcja może wyglądać tak:

function foo(?Type $t)
{

}

Jak tylko będziesz mógł pracować z PHP 7.1, ta notacja powinna być preferowana zamiast function foo(Type $t = null), ponieważ nadal zmusza wywołującego do jawnego podania argumentu dla parametru $t.

 21
Author: TheOperator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-09 08:55:05

Try:

function foo(Type $t = null) {

}

Sprawdź argumenty funkcji PHP .

 8
Author: SeanWM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-29 13:33:42

Jak już wspomniano, jest to możliwe tylko wtedy, gdy podasz null jako wartość domyślną.

Ale najczystszym, bezpiecznym dla typu rozwiązaniem obiektowym będzie 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)';
    }
}

Użycie:

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);
 4
Author: Fabian Schmengler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-29 13:43:34