【问题标题】:Does PHP have autovivification?PHP 有自动生存功能吗?
【发布时间】:2011-08-23 07:02:30
【问题描述】:

在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 确实具有此功能的规范答案(最好有参考资料),以及任何详细信息,例如引入它的版本、怪癖、快捷方式等?

【问题讨论】:

  • 这将在您分配值时起作用。 PHP 将为您创建该路径。这仅在您分配值时有效。
  • @JohnP 在珍珠的维基百科链接上的示例中似乎也是如此。
  • @Till 不知道珍珠代码在做什么。这对我来说都是巫术:)
  • perl,不是 'pearl' :) 我希望我的回答能帮助您了解 perl 如何对读取操作进行自动验证。
  • 简单解释,Perl编程语言从一开始就是按照一个精心策划的设计系统地设计的。 PHP 没有。因此,该概念在 Perl 中具有特定的名称和含义。

标签: php perl autovivification


【解决方案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 还不存在,它将是 创建,所以这也是一个 另一种创建数组的方法。

但是,文档指出,如果您尝试访问未设置的数组(或键)的值,它将返回错误:

尝试访问数组键 没有定义的都是一样的 访问任何其他未定义的 变量:E_NOTICE 级错误 消息将发出,结果 将为 NULL。

我找到了我的旧 PHP3 手册,其中指出:

你也可以简单地创建一个数组 向数组添加值。

$a[] = "hello";

【讨论】:

  • 所以该功能确实存在,但 PHP.net 没有命名它,对吧?
  • 是的,我也将其追溯到 PHP3。它被简单地称为“创建数组的替代方法”。
【解决方案2】:

如果 PHP 支持 autovivification 则不是 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

【讨论】:

    【解决方案3】:

    在 perl 中,项目将在检查时自动激活,不需要分配。到达最里面的请求键所需的项目路径将在检查时创建。请注意,{d => undef} is 条目并不是实际创建的,而是隐含的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2017-01-22
      • 1970-01-01
      相关资源
      最近更新 更多