type - php optional parameters
Indicación de tipo: parámetros predeterminados (3)
Esto es una cuestión de tiempo de compilación versus valores de tiempo de ejecución. En la compilación solo se permiten valores literales (cadenas, números, valores booleanos y NULL). El procesador de PHP no puede conocer todas las clases posibles en este momento y, por lo tanto, no puede crear una instancia de un objeto en los argumentos de la función.
Lo que estoy esperando del extracto es que, mientras que normalmente pasar NULL a una función de tipo insinuado generará una Excepción / Error. Si establece un valor predeterminado como NULL, no lanzará esta excepción si se pasa NULL. No lo he probado, justo lo que esperaría.
Tipo 5 PHP
PHP 5 introduce Type Hinting. Las funciones ahora pueden forzar que los parámetros sean objetos ( especificando el nombre de la clase en el prototipo de la función ) o arrays
( desde PHP 5.1 ). Sin embargo, si se usa NULL
como valor de parámetro predeterminado, se permitirá como un argumento para cualquier llamada posterior.
El siguiente extracto de lo anterior:
Si se usa NULL
como valor de parámetro predeterminado, se permitirá como un argumento para cualquier llamada posterior.
Significa lo anterior:
Si los parámetros predeterminados deben usarse con las sugerencias de tipo, solo puede tener NULL
como valor predeterminado.
es decir, el código en code1 es incorrecto y da como resultado:
Error grave: el valor predeterminado para los parámetros con una sugerencia de tipo de clase solo puede ser NULL
código1:
function setName ( string $name = "happ") {
...
}
Donde el código en el código 2 es correcto:
código2:
function setName ( string $name = NULL) {
...
}
¿Por qué se asigna esta restricción en php?
No puede escribir cadenas de sugerencia, solo puede escribir objetos de pista y matrices, por lo que esto es incorrecto:
function setName ( string $name = "happ") {
(La razón por la que no obtiene un error de tiempo de compilación aquí es porque PHP está interpretando "cadena" como el nombre de una clase).
La redacción en los documentos significa que si haces esto:
function foo(Foo $arg) {
Entonces el argumento pasado a foo () debe ser una instancia del objeto Foo. Pero si haces esto:
function foo(Foo $arg = null) {
Entonces el argumento pasado a foo () puede ser una instancia del objeto Foo, o nulo. Tenga en cuenta también que si haces esto:
function foo(array $foo = array(1, 2, 3))
Entonces no puedes llamar a foo (nulo). Si quieres esta funcionalidad, puedes hacer algo como esto:
function foo(array $foo = null) {
if ($foo === null) {
$foo = array(1, 2, 3);
}
[Edit 1]
A partir de PHP 5.4, puede escribir sugerencia callable
:
function foo(callable $callback) {
call_user_func($callback);
}
[Edit 2]
A partir de PHP 7.0, puede escribir sugerencias bool
, float
, int
y string
. Esto hace que el código en la pregunta sea sintaxis válida. A partir de PHP 7.1, puede escribir sugerencia iterable
.
Las declaraciones de tipo (también conocidas como sugerencias de tipo en PHP 5) de un tipo de string
son compatibles con PHP 7.
Los tipos válidos son:
- Clase / nombre de interfaz (> = PHP 5.0.0);
-
self
(> = PHP 5.0.0); -
array
(> = PHP 5.1.0); -
callable
(> = PHP 5.4.0); -
bool
,float
,int
,string
(> = PHP 7.0.0); - iterable - ya sea una matriz o una instancia de Traversable (> = PHP 7.1.0).