msgbartop
PHP语言, PHP扩展, Zend引擎相关的研究,技术,新闻分享 – 左手代码 右手诗
msgbarbottom

10 Oct 11 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变得更好.

谢谢


分享到:



Related Posts:

Tags: ,

11 Responses to “Array dereferencing”

  1. ロレックス gmt 特徴 |

    経営方針: 品質を重視、納期も厳守、信用第一は当社の方針です。
    ロレックス gmt 特徴 http://www.brandiwc.com/brand-19-copy-0.html

  2. ConchitaABoemer |

    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.

  3. Tim |

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

  4. GAN |

    这个确实方便许多啊

  5. Wilson |

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

  6. diyism |

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

  7. Snakevil |

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

  8. wynn |

    个人认为在这个语境下,“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表来看,二者之间很相似,那么对函数返回结果不能直接执行数组成员访问,就有点歧视的感觉……
    这个新特性实际上就是把这个缺陷补上。
    对象内的数据叫“属性”,数组内的数据叫“元素”,个人认为可以统一用“成员”来称呼,来体现这种关联性。

  9. 飞晏 |

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

  10. Demon |

    忘写Q了 = = [防止spam已保护性隐藏]
    Sina weibo http://weibo.com/lonedemon

  11. Demon |

    加Q交个朋友~PHPer.

Leave a Reply

*