php

php - ¿Cuál es la diferencia entre? Int $ number y int $ number=null?



(3)

Es importante distinguir entre las dos características del lenguaje que se analizan aquí, es decir, declaraciones de tipo y valores de argumento predeterminados .

La primera función solo usa declaraciones de tipo, esto significa que el argumento de entrada debe ser del tipo int o NULL .

La segunda función está utilizando tanto declaraciones de tipo como valores de argumento predeterminados, esto significa que el argumento debe ser del tipo int o NULL pero si se omite, será predeterminado a NULL .

Tome su primera función, si simplemente llamó a test() sin pasarle nada, obtendría:

Error fatal de PHP: ArgumentCountError no capturado: muy pocos argumentos para funcionar test () [...]

que es correcto ya que la función espera int o NULL pero no obtuvo ninguno, mientras que para el segundo, como ha definido el argumento con un valor predeterminado, se ejecutará sin errores.

Código

function test(?int $var) { var_dump($var); } function test2(int $var = null) { var_dump($var); } test(1); // fine test(); // error test2(1); // fine test2(); // fine

En cuanto al rendimiento, la diferencia es probablemente insignificante, nada lo suficientemente significativo como para ser motivo de preocupación.

Ejemplo en vivo

Repl

Dada esta explicación

Tipos anulables: las declaraciones de tipo para parámetros y valores de retorno ahora se pueden marcar como anulables al prefijar el nombre del tipo con un signo de interrogación. Esto significa que, además del tipo especificado, NULL puede pasarse como argumento o devolverse como valor, respectivamente.

https://www.php.net/manual/en/migration71.new-features.php

El siguiente código:

public function test(?int $var) { }

Significa que test() se puede llamar con $var como int o como null .

Y el siguiente código:

public function test(int $var = null) { }

Significa que test() se puede llamar con $var como int o como null .

¿Cuáles son las diferencias entre esos dos métodos? ¿Alguno de estos es más eficaz que el otro?


La diferencia es cómo puedes llamar a la función:

// public function test(?int $var) $foo->test("x"); // does not work (Argument 1 passed to Foo::test() must be of the type int or null, string given) $foo->test(123); // works $foo->test(null); // works $foo->test(); // does not work (Too few arguments to function Foo::test(), 0 passed) // public function test(int $var = null) $foo->test("x"); // does not work (Argument 1 passed to Foo::test() must be of the type int or null, string given) $foo->test(123); // works $foo->test(null); // works $foo->test(); // works

La diferencia es que no puede llamar a la función como ->test() usando la primera sintaxis.


Si el lenguaje fuera diseñado hoy, int $var = null probablemente sería un error, y realmente debería escribirse ?int $var = null . Las dos partes significan cosas diferentes:

  • El ? indica que null es un valor válido para ese parámetro.
  • El = null indica que null es el valor predeterminado si no se pasa el parámetro.

Sin embargo, antes de que se introdujera la sintaxis de ?type Había un caso especial en el lenguaje: si null se da como predeterminado para un parámetro, entonces es legal pasar null a ese parámetro, incluso si la declaración de tipo lo impidiera de otra manera .