Press "Enter" to skip to content

Array dereferencing

首先, 这个标题我不太清楚怎么翻译才能表达确切的意思, 直译不太妥当.
在PHP5.4中, 有一个新的改进:

- Added array dereferencing support. (Felipe)

在以前, 我们如果定义一个返回数组的函数:

<?php
function foo() {
    return array(1, 2, 3);
}

那么, 如果我要获取返回数组中的第二个元素, 就只能:

<?php
list(, $mid, ) = foo();

或者:

$tmp  =  $foo();
$mid = $tmp[1];

而从5.4开始, 我们就不需要这么麻烦了, 只需要:

<?php
$mid = foo()[1];

另外, 也可以使用引用:

<?php
function &getTable() {
     return $GLOBALS;
}
getTable()["foo"] = "laruence";
echo $foo;
//laruence

很方便吧? 呵呵. 最后提醒一下, PHP 5.4还处于开发阶段, 在最终release之前, 任何新特性都可能被调整或者更改. 如果大家有任何建议, 也欢迎反馈, 帮助我们使得PHP变得更好.
谢谢

11 Comments

  1. ConchitaABoemer
    ConchitaABoemer July 17, 2015

    After looking at a handful of the blog articles on your web page,
    I seriously appreciate your way of writing a blog.
    I book-marked it to my bookmark webpage list and will be checking back in the near future.
    Please check out my website too and let me know your opinion.

  2. Tim
    Tim November 19, 2011

    在Perl中,这个叫数组切片.

  3. GAN
    GAN November 1, 2011

    这个确实方便许多啊

  4. Wilson
    Wilson October 27, 2011

    一直期待着php能像js那样用数组呢,没想到现在支持了,真开心啊,return_array()[1]

  5. diyism
    diyism October 25, 2011

    dereference的意思:c语言里的*就是个”解除引用运算符”, *aPointer就是对aPointer解除引用以获得实体

  6. Snakevil
    Snakevil October 11, 2011

    我觉得“dereferencing”翻译成“反向引用”不错。“de-”前缀词根也可以做“反向”来理解。

  7. wynn
    wynn October 10, 2011

    个人认为在这个语境下,“dereferencing”可以翻译成“成员访问解析”。这个更新的内容可以翻译成“增加了数组成员访问解析支持”。(实际上完整的说在最前面应该加上“对函数返回结果”的定语)
    翻PHP的过往的一些信息,可以看出“dereferencing”这个字眼大致上是指“对(尝试)访问对象的属性(的语法)的解析”,也就是指诸如“->property” 这样的语法。
    在5.3上,可以运行下面几个代码:
    //代码1:对变量
    $obj = new stdClass();
    $obj->a = ‘string_a’;
    echo $obj->a;
    //代码2:对数组元素
    $array[‘a’] = new StdClass();
    $array[‘a’]->a = ‘string_a’;
    echo $array[‘a’]->a;
    //代码3:对函数返回结果
    function test(){
    $obj = new stdClass();
    $obj->a = ‘string_a’;
    return $obj;
    }
    echo test()->a;
    在所有这3种情况下,“->”操作都会尝试把之前的结果作为目标object,解析属性访问。而对于数组,只有前两种情况是允许的:
    //代码1:对变量
    $arr = array();
    $arr[‘a’] = ‘string_a’;
    echo $arr[‘a’];
    //代码2:对数组元素
    $array[‘a’] = array();
    $array[‘a’][‘a’] = ‘string_a’;
    echo $array[‘a’][‘a’];
    //代码3:对函数返回结果,出错。
    function test(){
    $array = array();
    $array[‘a’] = ‘string_a’;
    return $array;
    }
    echo test()[‘a’];
    实际上如果不考虑对象的方法,只关注数据的话,对象和数组都可以当作hash表来看,二者之间很相似,那么对函数返回结果不能直接执行数组成员访问,就有点歧视的感觉……
    这个新特性实际上就是把这个缺陷补上。
    对象内的数据叫“属性”,数组内的数据叫“元素”,个人认为可以统一用“成员”来称呼,来体现这种关联性。

  8. 飞晏
    飞晏 October 10, 2011

    这样确实可以省一个变量的功夫。
    只取一个元素这样用最方便,取多个元素(不一定是全部)就不能这样了吧。

  9. Demon
    Demon October 10, 2011

    加Q交个朋友~PHPer.

Comments are closed.