最新消息:

PHP5.4中一个需要注意的变化(Chained string offsets)

php admin 3002浏览 0评论

在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:


Copyright © 2010 风雪之隅 版权所有, 转载务必注明. 该Feed只供个人使用, 禁止未注明的转载或商业应用. 非法应用的, 一切法律后果自负. 如有问题, 可发E-mail至my at laruence.com.(Digital Fingerprint: 73540ba0a1738d7d07d4b6038d5615e2)

Related Posts:

转载请注明:爱开源 » PHP5.4中一个需要注意的变化(Chained string offsets)

您必须 登录 才能发表评论!