Подтвердить что ты не робот

Есть ли у 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, ярлыки и т.д.?

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

$a[] = "hello";

Ответ 2

Ну, не 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);

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

Ответ 3

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