- 作者: Laruence( )
- 本文地址: http://www.laruence.com/2011/11/28/2317.html
- 转载请注明出处
在PHP5.4中, 对字符串多级取值(offset), 做了一个一致性改进. 比如对于下面的例子:
<?php $str = "laruence"; echo $str[0][0][0][0]; ?>
在PHP5.4之前, 上面的代码会导致一个Fatal error:
PHP Fatal error: Cannot use string offset as an array
这个错误其实很莫名, 因为$str[0], 是’l’, 也是一个字符串, 那么按理来说, $str[0][0]还应该是’l’, 于是在PHP5.4中, 对这个不一致性做了改进. 但是也带来了一个需要注意的变化.
对于上面的列子, 在PHP5.4将输出”l”.
但是, 这样就带来一个明显的变化:
<?php $arr = array( "name" => "laruence", //如果这个值有可能是数组,或者字符串. ); if (isset($arr["name"]["foo"]["non-exists"])) { echo "set"; }
注意上面的代码, 因为对arra的数组的元素的值类型不确定(有可能是数组,也有可能是字符串), 那么在PHP5.4之前, 上面的代码, 错误的表现出了正确: 不管数组还是字符串, 都可以返回看似正确的没有isset.
而从5.4开始, 将会输出”set”.
这是为什么呢?
因为类型转换, 当$arr[“name”]是字符串的时候, 对它做offset取值, 都会把键值转换成interge, 所以, “foo”和”non-exists”都会转换成0.
也就是, $arr[“name”][0][0], 所以isset为真.
当然, 如果你之前一直是使用array_key_exists的话, 这个变化倒也影响不到你.
这个变化需要以后在你不能保证一个数组中值的类型的(数组,字符串)的时候, 如果做isset操作, 需要增加一些额外的is_array判断...
不过, 还是要提醒下: PHP 5.4还处于开发阶段, 在最终release之前, 任何新特性都可能被调整或者更改. 如果大家有任何建议, 也欢迎反馈, 帮助我们使得PHP变得更好.
谢谢
更多更新信息, 请关注: Changelog
Comments
- 2011/11/28, liuw writes: 多谢指明,之前也有碰到多维数组中神奇的Cannot use string offset as an array的问题。
- 2011/11/28, CFC4N writes: 调试bug将更难了。
- 2011/11/28, treesky writes: 代码要更加仔细了。
- 2011/11/28, 雪候鸟 writes: @treesky @CFC4N 没那么夸张了, 主要是保证数据结构的正确性就行了. 🙂
- 2011/11/28, 神仙 writes: 字符串到数字的无缝转换是一个很容易引发bug的地方。在字符串不是数字表达式的时候,能抛个warning么
- 2011/11/29, Qianfeng writes: 这个还真的是个问题!如果是字符串的offset 只有纯数字才做转换,数字不做转换就好了~
比如 $arr[“name”][“foo”] foo 不会转成0
而 ($arr[“name”][‘0’] 才会转出 0
- 2011/12/01, shaukei writes: 很少用isset。应该这个对我影响不大!
- 2011/12/02, Lisces writes: 这个算feature么 感觉这个变化不但没什么实用价值 而且还会引起很多老代码的潜在问题 为什么要做这样的设计呢?
- 2011/12/02, xiefei writes: 这个问题会引起查找困难,不能让字符串强制转换成int类型才行,否则要给出warning错误。
- 2011/12/10, Iterse’s blog writes: 程序中数据类型可控性要求高了
- 2011/12/12, Liuxd writes: 真心希望PHP把数据类型控制的严格些,弱类型使得很多时候在数据类型上出问题,即使不出问题也要为类型转换伤很多脑筋。虽然不指望能像C那么明确,但是至少错误提示能更想详细些,减少调试成本。感慨下,PHP这种脚本语言大多松散类型,看似是为了降低学习门槛、提高开发效率。但是当要严格控制代码质量的时候,其实松散类型是最讨厌的,唉~
- 2011/12/14, princehaku writes: 学习了.
- 2011/12/19, 之前提到的PHP5.4一个注意点的update | 风雪之隅 writes: […] 我曾经介绍过, 在PHP5.4中, PHP5.4中一个需要注意的变化(Chained string offsets) , 后续因为大多数人都表示这个变化很敏感, 容易成为坑.. 于是, […]
Related posts:
- 之前提到的PHP5.4一个注意点的update
- PHP5.3 α2初体验
- PHP的单引号和双引号
- 深入理解PHP原理之Session Gc的一个小概率Notice
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
Copyright © 2010 风雪之隅 版权所有, 转载务必注明. 该Feed只供个人使用, 禁止未注明的转载或商业应用. 非法应用的, 一切法律后果自负. 如有问题, 可发E-mail至my at laruence.com.(Digital Fingerprint: 73540ba0a1738d7d07d4b6038d5615e2)