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?
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 naNULL
.
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 .
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
.
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
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);
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