公司还是不推荐用python,只好屈服使用php,不过用python习惯了,真是发现有些地方不适应,今天写了一段代码,语法检查怎么都通不过,特地放在这里,希望有朋友能指点一下。

代码如下:

1
2
3
4
5
6
7
8
9
function get()
{
    $arr = array(
        1,2,3
    );
    return $arr;
}
$y = get()[1];
echo $y;

执行会报如下错误:

Parse error: syntax error, unexpected '['

一开始我还以为又是少写';'之类的问题,仔细检查未果,所以把代码拆成两行,变成:

1
2
$y = get();
$y = $y[1];

居然执行成功了!

于是我不解了,为什么连c++都支持的语法,而php里面却不肯支持?

c++的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
vector<int> foo()
{
    vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    return vec;
}
int main(int argc, char **argv)
{
    cout << foo()[1] << endl;
    return 0;
}

更不用说python:

1
2
3
def foo():
    return [1,2,3]
print foo()[1]

代码都可以正确执行。

在公司问了校友那边的同事,也是没有人知道为什么php不给与支持。

其实按照我的理解,语法上支持连缀应该是一种简约化的趋势,包括python的django,jquery,其实都在使用连缀。
有的朋友可能说,这样出错了不好定位,如果是在C中,我承认的确如此,因为需要通过错误返回码来进行错误定位;但是像python这种高级语言有着“异常”强大的支持,异常捕获完全可以替你完成这件事情。

OK,就是这样~其实并不是说php不好,php这样设计必然也有他的原因,我只是想弄清楚原因是什么。





原创文章,版权所有。转载请注明:转载自Vimer的程序世界 [ http://www.vimer.cn ]

本文链接地址: http://www.vimer.cn/?p=2161

34 个评论 在 “php无法用下标操作函数返回的数组”

  1. leeon 说:

    php的一些编码规则还是比较蛋疼的,改造成这样也省了一次变量转换:
    function get($i)
    {
    $arr = array(
    1,2,3
    );
    return $arr[$i];
    }

    [回复]

    Dante 回复:

    是够纠结的。。。

    [回复]

  2. 依云 说:

    完了,这样一来我更不想学 PHP 了。。。

    [回复]

    Dante 回复:

    今天又发现php一个json_encode的问题。。唉,没办法,非学不可啊。。

    [回复]

  3. 星光居士 说:

    连腾讯都不鼓励用python,这说明了很多问题,也回答了很多问题

    [回复]

    Dante 回复:

    嗯,其实这也可以理解,毕竟团队的沉淀是很重要的,突然转向一种不熟悉的语言带来的规范,积累,招聘等问题都会很多。

    [回复]

    笨猫猫 回复:

    我汗~ 星光兄,我们居然发现你了。
    -_-!

    [回复]

    星光居士 回复:

    看来大家都是vim的人啊

    [回复]

    tkdchen 回复:

    说明什么问题了?
    回答什么问题了?

    [回复]

    星光居士 回复:

    呵呵,意会啊意会啊

    [回复]

  4. 挖路 说:

    :-)
    各个语言间的语法差异是肯定的,你得包容的看待这个问题啊。
    我刚学python的时候就为了他把列表和字典搞成两个类型而郁闷了老久,在php里,一个array就搞定一切了。

    [回复]

    Dante 回复:

    其实如果有原因的话,也不是不能接受,关键是实在想不通。。如果array看作一个对象的话,那[]操作符无非是他的一个成员函数,既然php中的对象可以这么用,没道理array就不可以嘛。。。

    [回复]

    依云 回复:

    Python 是注重效率的语言,所以 list 和 dict 肯定得分开了,一个是用动态数组实现的,另一个是 hash 表。而且,如果不分开的话,for..in 的时候你就要郁闷了(我就对 Javascript 的 for in 应用于数组时很不爽)。

    [回复]

    Dante 回复:

    确实如此,感觉php把两个array统一之后,很多东西被掩盖掉了,比如其关联数组中的key还是能够记住原来顺序:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    $arr1 = array(
        'x'=>1,
        'y'=>2,
    );
    var_dump($arr1);
     
    $arr2 = array(
        'y'=>2,
        'x'=>1,
    );
    var_dump($arr2);

    输出结果是:

    array(2) {
      ["x"]=>
      int(1)
      ["y"]=>
      int(2)
    }
    array(2) {
      ["y"]=>
      int(2)
      ["x"]=>
      int(1)
    }

    而对python或者stl的map,就会都变成有序的。

    [回复]

  5. sophiasmth 说:

    原因就是PHP很2

    [回复]

  6. narky 说:

    PHP其他都还好,就是这个比较纠结。
    泥马连ASP都能支持部分连缀,有木有!!!

    比如:conn.execute(“select top 1 username from table where id=1″)(0)

    [回复]

  7. PHP我不熟……不发表意见哈。

    [回复]

  8. 全恒壮 说:

    PHP确实不能这么用。取得数组第1个元素,有时会借助一个函数 current(get());。为什么这么设计就想不通了,或许就是PHP的一个缺陷吧,另外PHP函数返回值类型本来是不确定的,直接这样用不好吧。

    [回复]

  9. terrysco 说:

    每个脚本语言都有自己的习惯,与其深究于这种小问题,不如多花点时间在PHP架构上。

    [回复]

    Dante 回复:

    呵呵,见仁见智。

    [回复]

  10. qq 说:

    原来vimer.cn还是公司同事的.从oa上点过来的:)

    [回复]

    Dante 回复:

    呵呵是啊~~

    [回复]

  11. 流年 说:

    一开始也郁闷过,不过自己用的时候,返回的数组貌似多用于迭代,这样子保存临时变量反而更好一点。。
    至于php为啥这样设计,倒也不知道

    [回复]

  12. Jaylyn 说:

    I had no idea how to approach this befroe—now I’m locked and loaded.

    [回复]

  13. 无缺 说:

    其实我个人不赞成那中一长串式的写法,而赞成把操作拆分开,这样操作粒度更细更容易控制,也更清楚。我觉得那种一长串的东西看着头疼…

    仁者见仁啦,^_^。

    [回复]

    Dante 回复:

    哈哈,的确见仁见智~
    在C、C++编程的时候,我也不会用连缀~ 在用django的时候就比较多

    [回复]

  14. zjstandup 说:

    php中[]符号针对变量的

    [回复]

    Dante 回复:

    我的理解是,所谓的变量只不过是指向数据的一个指针。
    所以还是说不通的……

    [回复]

  15. seatle 说:

    不是不支持,是目前用的比较多的版本不支持,新出的5.3.3版本就支持了

    [回复]

  16. seatle 说:

    像这种小功能,要弄太简单了,只是之前没人提交而已,一提交,PHP下个版本马上就支持了

    [回复]

  17. iminto 说:

    php5.4支持了。

    [回复]

    Dante 回复:

    嗯,这样有些时候,语句就可以少几行了

    [回复]

  18. istrone 说:

    PHP5.4支持这种用法了!

    [回复]

我要评论

*

*