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
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.
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 quenull
es un valor válido para ese parámetro. -
El
= null
indica quenull
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 .