Есть ли в PHP автовивификация? - PullRequest
16 голосов
/ 11 мая 2011

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

Этот код PHP работает нормально:

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

array
  'a' => 
    array
      4 => 
        array
          'b' => 
            array
              ...

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

Ответы [ 3 ]

10 голосов
/ 11 мая 2011

Да, в 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 сообщение будет выдано, и результат будет НЕДЕЙСТВИТЕЛЕН.

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

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

$a[] = "hello";
3 голосов
/ 26 октября 2011

в 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
        ];
3 голосов
/ 11 мая 2011

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

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

...