最后更新于 .

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

function get()
{
    $arr = array(
        1,2,3
    );
    return $arr;
}
$y = get()[1];
echo $y;

执行会报如下错误:

Parse error: syntax error, unexpected '['

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

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

居然执行成功了! 于是我不解了,为什么连c++都支持的语法,而php里面却不肯支持? c++的代码如下:

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:

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

代码都可以正确执行。 在公司问了校友那边的同事,也是没有人知道为什么php不给与支持。 其实按照我的理解,语法上支持连缀应该是一种简约化的趋势,包括python的django,jquery,其实都在使用连缀。 有的朋友可能说,这样出错了不好定位,如果是在C中,我承认的确如此,因为需要通过错误返回码来进行错误定位;但是像python这种高级语言有着“异常”强大的支持,异常捕获完全可以替你完成这件事情。 OK,就是这样~其实并不是说php不好,php这样设计必然也有他的原因,我只是想弄清楚原因是什么。

Pingbacks

  1. Thinking In LAMP Blog &raquo; Blog Archive &raquo; on #

    [...] http://www.vimer.cn/2011/04/php%E6%97%A0...%9E%E7%9A%84%E6%95%B0%E7%BB%84.html   php无法用下标操作函数返回的数组 [...]

Pingbacks已打开。

Trackbacks

引用地址

评论

  1. leeon

    leeon on #

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

    Reply

    1. Dante

      Dante on #

      是够纠结的。。。

      Reply

  2. 依云

    依云 on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  3. 星光居士

    星光居士 on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

    2. 笨猫猫

      笨猫猫 on #

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

      Reply

      1. 星光居士

        星光居士 on #

        看来大家都是vim的人啊

        Reply

    3. tkdchen

      tkdchen on #

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

      Reply

      1. 星光居士

        星光居士 on #

        呵呵,意会啊意会啊

        Reply

  4. 挖路

    挖路 on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

    2. 依云

      依云 on #

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

      Reply

      1. Dante

        Dante on #

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

        <pre lang="php" line="1">
        $arr1 = array(
        'x'=>1,
        'y'=>2,
        );
        var_dump($arr1);

        $arr2 = array(
        'y'=>2,
        'x'=>1,
        );
        var_dump($arr2);
        </pre>
        输出结果是:
        <pre lang="txt" line="0">
        array(2) {
        ["x"]=>
        int(1)
        ["y"]=>
        int(2)
        }
        array(2) {
        ["y"]=>
        int(2)
        ["x"]=>
        int(1)
        }
        </pre>
        而对python或者stl的map,就会都变成有序的。

        Reply

  5. sophiasmth

    sophiasmth on #

    原因就是PHP很2

    Reply

  6. narky

    narky on #

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

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

    Reply

  7. WILDEN气动隔膜泵

    WILDEN气动隔膜泵 on #

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

    Reply

  8. 全恒壮

    全恒壮 on #

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

    Reply

  9. terrysco

    terrysco on #

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

    Reply

    1. Dante

      Dante on #

      呵呵,见仁见智。

      Reply

  10. qq

    qq on #

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

    Reply

    1. Dante

      Dante on #

      呵呵是啊~~

      Reply

  11. 流年

    流年 on #

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

    Reply

  12. Jaylyn

    Jaylyn on #

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

    Reply

  13. 无缺

    无缺 on #

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

    仁者见仁啦,^_^。

    Reply

    1. Dante

      Dante on #

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

      Reply

  14. zjstandup

    zjstandup on #

    php中[]符号针对变量的

    Reply

    1. Dante

      Dante on #

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

      Reply

  15. seatle

    seatle on #

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

    Reply

  16. seatle

    seatle on #

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

    Reply

  17. iminto

    iminto on #

    php5.4支持了。

    Reply

    1. Dante

      Dante on #

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

      Reply

  18. istrone

    istrone on #

    PHP5.4支持这种用法了!

    Reply

  19. PHP学习

    PHP学习 on #

    博客文章都还好 欢迎回访http://www.iiwnet.com

    Reply

  20. a

    a on #

    php版本问题。低版本不支持。。

    Reply

发表评论