请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

php163

 找回密码
 立即注册

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 2768|回复: 8

PHP5.4中一个需要注意的变化(Chained string offsets) [复制链接]

Rank: 4

发表于 2011-12-3 16:48:40 |显示全部楼层

在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变得更好.

谢谢

本文转自: http://www.laruence.com/2011/11/28/2317.html

&lt;-sina_sign,1904235783,a3b2e71b,1-&gt;

使用道具 举报

发表于 2011-12-3 18:12:00 |显示全部楼层

使用道具 举报

发表于 2011-12-3 20:43:23 |显示全部楼层
回复@hutufei:为什么啊?我试了一下,可以以啊,再给你发一下吧, http://t.cn/Sb3GC2

来自 程序开发那些事 的新浪微博

使用道具 举报

发表于 2011-12-3 22:28:22 |显示全部楼层
回复@程序开发那些事:您指定的网页无法访问! 错误类型:连接失败,悲剧了

来自 hutufei 的新浪微博

使用道具 举报

发表于 2011-12-3 23:14:48 |显示全部楼层
回复@hutufei:你能访问 php163.com 吗?你那里是教育网?

来自 程序开发那些事 的新浪微博

使用道具 举报

发表于 2011-12-4 01:00:26 |显示全部楼层
回复@程序开发那些事:该死的海泰网,请问dr。com客户端有破坏的理论可能性么?

来自 hutufei 的新浪微博

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

QQ:24940422 2698114111 电话:0532-89993080|Archiver|手机版|php163开源技术分享社区   

GMT+8, 2019-1-22 16:24 , Processed in 0.039884 second(s), 14 queries .

Powered by Discuz!

PHP开源技术分享门户

回顶部