with variable type silence parameter hinting array php type-hinting

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 en NULL .

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 .