Есть ли у PHP автовивитация?

Поиск PHP.net для автовизуализации не дает никаких результатов. На момент написания статьи Wikipedia утверждает, что это имеет только Perl. Нет четких окончательных результатов при поиске в Google для «автоподвинения php».

Этот код PHP отлично работает:

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

Может ли кто-нибудь дать канонический ответ (желательно со ссылками), что у PHP есть эта функция, и какие-либо детали, такие как версия, в которую она была введена, quirks, ярлыки и т. Д.?

Да, PHP имеет автовивизацию (и имел это в течение длительного времени), хотя на эту терминологию не ссылается. PHP.net заявляет:

Существующий массив может быть изменен путем явной установки значений в нем.

Это делается путем назначения значений массиву, указав ключ в скобках. Ключ также можно опустить, в результате получается пустая пара скобок ([]).

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

Если $ arr еще не существует, он будет создан, поэтому это также альтернативный способ создания массива.

Однако в документации указано, что если вы попытаетесь получить доступ к значению несохраненного массива (или ключа), он вернет ошибку:

Попытка доступа к ключу массива, который не был определен, совпадает с доступом к любой другой неопределенной переменной: выдается сообщение об ошибке уровня E_NOTICE, и результат будет NULL.

Я отследил свое старое руководство PHP3 , в котором говорится следующее:

Вы также можете создать массив, просто добавив значения в массив.

 $a[] = "hello"; 

Ну, не 100%, если PHP поддерживает автовизацию, но синтаксис, который вы публикуете, работает по большей части.

 // 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); 

Невозможно использовать [] для чтения: Связанная ссылка

в perl, предметы будут автогенерироваться при проверке, назначение не требуется. При проверке будет создан путь предметов, необходимых для доступа к самому внутреннему запрошенному ключу. Обратите внимание, что запись {d => undef} не создается, а подразумевается.

  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; 

вывод:

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

Пример массива 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; 

Вывод:

 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 ];