PHP有自动修复吗?

时间:2011-05-11 12:41:51

标签: php perl autovivification

搜索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 个答案:

答案 0 :(得分:10)

是的,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";

答案 1 :(得分:3)

如果PHP支持自动生成,但不是100%,但你发布的语法大部分都适用。

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

无法使用[]阅读:Related Link

答案 2 :(得分: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
        ];