php perl autovivification

¿PHP tiene autovivificación?



perl autovivification (3)

La búsqueda de PHP.net para la autovivificación no da ningún resultado. En el momento de escribir este artículo, Wikipedia afirma que solo Perl lo tiene. No hay resultados claramente definitivos cuando se busca en Google "autovivificación php".

Este código PHP funciona bien:

$test[''a''][4][6][''b''] = "hello world"; var_dump($test); array ''a'' => array 4 => array ''b'' => array ...

¿Alguien puede proporcionar una respuesta canónica (preferiblemente con referencias) de que PHP tenga esta característica, y detalles como la versión en la que se introdujo, las peculiaridades, los accesos directos, etc.?


Bueno, no al 100% si PHP admite la autovivificación, pero la sintaxis que publica funciona en su mayor parte.

// Works as you have assigned a value of ''hello'' $a[''a''][4][6][''b''] = "hello"; var_dump($a); echo print_r($a,true); // works as you have assigned a value of ''world'' $b[][][][] = "world"; var_dump($b); echo print_r($b,true); // ERROR: Cannot use [] for reading $c[]; var_dump($c); echo print_r($c,true);

No se puede usar [] para leer: Enlace relacionado


En Perl, los artículos se autovivificarán después de la inspección, la asignación no es necesaria. La ruta de los elementos necesarios para llegar a la clave más interna solicitada se creará en la inspección. Tenga en cuenta que la entrada {d => undef} no se crea realmente, pero está implícita.

use strict; use warnings; use Data::Dumper; my %a; # as is empty, equivalent to /%a is {}; print Dumper %a; $a{b}{c}{d}; # /%a is now { b => { c => {}}} # returns an undef value. print Dumper /%a;

salida:

$VAR1 = {}; $VAR1 = { ''b'' => { ''c'' => {} } };

Ejemplo de matriz perl:

use strict; use warnings; use Data::Dumper; my (@b,@c); # @b=(), @c=() print Dumper /@b; $b[3]; # @b=() aka unchanged. print Dumper /@b; $b[3][2][1]; # @b=(undef,undef,undef,[undef,undef,[]]) print Dumper /@b; print Dumper /@c; $c[3]=1 ; # @c=(undef,undef,undef,1) print Dumper /@c;

Salida:

Useless use of array element in void context at -e line 7. Useless use of array element in void context at -e line 9. $VAR1 = []; $VAR1 = []; $VAR1 = [ undef, undef, undef, [ undef, undef, [] ] ]; $VAR1 = []; $VAR1 = [ undef, undef, undef, 1 ];


Sí, PHP tiene autovivificación (y la ha tenido durante mucho tiempo), aunque no está referenciada por esa terminología. Estados de PHP.net :

Una matriz existente se puede modificar estableciendo explícitamente los valores en ella.

Esto se hace asignando valores a la matriz, especificando la clave entre paréntesis. La clave también se puede omitir, dando como resultado un par de corchetes vacíos ([]).

$arr[key] = value; $arr[] = value; // key may be an integer or string // value may be any value of any type

Si $ arr no existe todavía, se creará, por lo que esta también es una forma alternativa de crear una matriz.

Sin embargo, la documentación indica que si intenta acceder al valor de una matriz no configurada (o clave), devolverá un error:

Intentar acceder a una clave de matriz que no se ha definido es lo mismo que acceder a cualquier otra variable no definida: se emitirá un mensaje de error de nivel E_NOTICE y el resultado será NULL.

He rastreado mi viejo manual de PHP3 , que dice esto:

También puede crear una matriz simplemente agregando valores a la matriz.

$a[] = "hello";