php无法用下标操作函数返回的数组
Published on 四月 11, 2011
公司还是不推荐用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
php的一些编码规则还是比较蛋疼的,改造成这样也省了一次变量转换:
function get($i)
{
$arr = array(
1,2,3
);
return $arr[$i];
}
[回复]
Dante 回复:
四月 12th, 2011 at 4:02 下午
是够纠结的。。。
[回复]
完了,这样一来我更不想学 PHP 了。。。
[回复]
Dante 回复:
四月 13th, 2011 at 11:09 下午
今天又发现php一个json_encode的问题。。唉,没办法,非学不可啊。。
[回复]
连腾讯都不鼓励用python,这说明了很多问题,也回答了很多问题
[回复]
Dante 回复:
四月 13th, 2011 at 11:08 下午
嗯,其实这也可以理解,毕竟团队的沉淀是很重要的,突然转向一种不熟悉的语言带来的规范,积累,招聘等问题都会很多。
[回复]
笨猫猫 回复:
四月 17th, 2011 at 11:29 上午
我汗~ 星光兄,我们居然发现你了。
-_-!
[回复]
星光居士 回复:
四月 18th, 2011 at 7:42 下午
看来大家都是vim的人啊
[回复]
tkdchen 回复:
四月 20th, 2011 at 10:19 上午
说明什么问题了?
回答什么问题了?
[回复]
星光居士 回复:
四月 20th, 2011 at 11:47 上午
呵呵,意会啊意会啊
[回复]
各个语言间的语法差异是肯定的,你得包容的看待这个问题啊。
我刚学python的时候就为了他把列表和字典搞成两个类型而郁闷了老久,在php里,一个array就搞定一切了。
[回复]
Dante 回复:
四月 15th, 2011 at 3:13 下午
其实如果有原因的话,也不是不能接受,关键是实在想不通。。如果array看作一个对象的话,那[]操作符无非是他的一个成员函数,既然php中的对象可以这么用,没道理array就不可以嘛。。。
[回复]
依云 回复:
四月 16th, 2011 at 1:09 下午
Python 是注重效率的语言,所以 list 和 dict 肯定得分开了,一个是用动态数组实现的,另一个是 hash 表。而且,如果不分开的话,for..in 的时候你就要郁闷了(我就对 Javascript 的 for in 应用于数组时很不爽)。
[回复]
Dante 回复:
四月 16th, 2011 at 8:36 下午
确实如此,感觉php把两个array统一之后,很多东西被掩盖掉了,比如其关联数组中的key还是能够记住原来顺序:
输出结果是:
array(2) { ["x"]=> int(1) ["y"]=> int(2) } array(2) { ["y"]=> int(2) ["x"]=> int(1) }而对python或者stl的map,就会都变成有序的。
[回复]
原因就是PHP很2
[回复]
PHP其他都还好,就是这个比较纠结。
泥马连ASP都能支持部分连缀,有木有!!!
比如:conn.execute(“select top 1 username from table where id=1″)(0)
[回复]
PHP我不熟……不发表意见哈。
[回复]
PHP确实不能这么用。取得数组第1个元素,有时会借助一个函数 current(get());。为什么这么设计就想不通了,或许就是PHP的一个缺陷吧,另外PHP函数返回值类型本来是不确定的,直接这样用不好吧。
[回复]
每个脚本语言都有自己的习惯,与其深究于这种小问题,不如多花点时间在PHP架构上。
[回复]
Dante 回复:
四月 18th, 2011 at 6:10 下午
呵呵,见仁见智。
[回复]
原来vimer.cn还是公司同事的.从oa上点过来的:)
[回复]
Dante 回复:
四月 24th, 2011 at 2:34 下午
呵呵是啊~~
[回复]
一开始也郁闷过,不过自己用的时候,返回的数组貌似多用于迭代,这样子保存临时变量反而更好一点。。
至于php为啥这样设计,倒也不知道
[回复]
[...] http://www.vimer.cn/2011/04/php%E6%97%A0…%9E%E7%9A%84%E6%95%B0%E7%BB%84.html php无法用下标操作函数返回的数组 [...]
I had no idea how to approach this befroenow Im locked and loaded.
[回复]
其实我个人不赞成那中一长串式的写法,而赞成把操作拆分开,这样操作粒度更细更容易控制,也更清楚。我觉得那种一长串的东西看着头疼…
仁者见仁啦,^_^。
[回复]
Dante 回复:
七月 31st, 2011 at 8:20 下午
哈哈,的确见仁见智~
在C、C++编程的时候,我也不会用连缀~ 在用django的时候就比较多
[回复]
php中[]符号针对变量的
[回复]
Dante 回复:
八月 7th, 2011 at 11:06 上午
我的理解是,所谓的变量只不过是指向数据的一个指针。
所以还是说不通的……
[回复]
不是不支持,是目前用的比较多的版本不支持,新出的5.3.3版本就支持了
[回复]
像这种小功能,要弄太简单了,只是之前没人提交而已,一提交,PHP下个版本马上就支持了
[回复]
php5.4支持了。
[回复]
Dante 回复:
八月 21st, 2011 at 11:22 下午
嗯,这样有些时候,语句就可以少几行了
[回复]
PHP5.4支持这种用法了!
[回复]