php - variable - No se puede pasar el argumento nulo cuando se usa la sugerencia de tipo
type hinting php 7 (4)
A partir de PHP 7.1, los tipos anulables están disponibles, ya que ambos tipos y parámetros de devolución de funciones. El tipo ?T
puede tener valores del Tipo T
especificado o null
.
Entonces, tu función podría verse así:
function foo(?Type $t)
{
}
Tan pronto como pueda trabajar con PHP 7.1, esta notación debe preferirse a la function foo(Type $t = null)
, porque aún obliga al llamante a especificar explícitamente un argumento para el parámetro $t
.
El siguiente código:
<?php
class Type {
}
function foo(Type $t) {
}
foo(null);
?>
falló en tiempo de ejecución:
PHP Fatal error: Argument 1 passed to foo() must not be null
¿Por qué no se permite pasar nulo al igual que otros idiomas?
Como otras respuestas ya mencionadas, esto solo es posible si especifica null
como el valor predeterminado.
Pero la solución más limpia orientada a objetos tipo seguro sería un objeto 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)'';
}
}
Uso:
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);
Tienes que agregar un valor predeterminado como
function foo(Type $t = null) {
}
De esa forma, puedes pasarle un valor nulo.
Esto está documentado en la sección en el manual sobre Declaraciones de Tipo :
Se puede hacer que la declaración acepte valores
NULL
si el valor predeterminado del parámetro se establece enNULL
.
Desde PHP 7.1 (publicado el 2 de diciembre de 2016), puede declarar explícitamente que una variable es null
con esta sintaxis
function foo(?Type $t) {
}
esto dará como resultado
$this->foo(new Type()); // ok
$this->foo(null); // ok
$this->foo(); // error
Entonces, si quiere un argumento opcional, puede seguir la convención Type $t = null
mientras que si necesita hacer que un argumento acepte tanto el null
como su tipo, puede seguir el ejemplo anterior.
Puedes leer más here .