最新消息:

Array dereferencing

php admin 2770浏览 0评论

在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变得更好.

谢谢


Comments

  • 2011/10/10, Demon writes: 加Q交个朋友~PHPer.
  • 2011/10/10, Demon writes: 忘写Q了 = = [防止spam已保护性隐藏]
    Sina weibo http://weibo.com/lonedemon
  • 2011/10/10, 飞晏 writes: 这样确实可以省一个变量的功夫。
    只取一个元素这样用最方便,取多个元素(不一定是全部)就不能这样了吧。
  • 2011/10/10, wynn writes: 个人认为在这个语境下,“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表来看,二者之间很相似,那么对函数返回结果不能直接执行数组成员访问,就有点歧视的感觉……
    这个新特性实际上就是把这个缺陷补上。
    对象内的数据叫“属性”,数组内的数据叫“元素”,个人认为可以统一用“成员”来称呼,来体现这种关联性。

  • 2011/10/11, Snakevil writes: 我觉得“dereferencing”翻译成“反向引用”不错。“de-”前缀词根也可以做“反向”来理解。
  • 2011/10/25, diyism writes: dereference的意思:c语言里的*就是个”解除引用运算符”, *aPointer就是对aPointer解除引用以获得实体
  • 2011/10/27, Wilson writes: 一直期待着php能像js那样用数组呢,没想到现在支持了,真开心啊,return_array()[1]
  • 2011/11/01, GAN writes: 这个确实方便许多啊
  • 2011/11/19, Tim writes: 在Perl中,这个叫数组切片.

Related posts:


Copyright © 2010 风雪之隅 版权所有, 转载务必注明. 该Feed只供个人使用, 禁止未注明的转载或商业应用. 非法应用的, 一切法律后果自负. 如有问题, 可发E-mail至my at laruence.com.(Digital Fingerprint: 73540ba0a1738d7d07d4b6038d5615e2)

Related Posts:

转载请注明:爱开源 » Array dereferencing

您必须 登录 才能发表评论!