加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP 5.2允许对象语法调用数组索引?

发布时间:2020-12-13 17:16:50 所属栏目:PHP教程 来源:网络整理
导读:我们最近遇到了一场灾难,不得不将 PHP Web应用程序从 PHP Version 5.2.6-1 lenny16移到PHP Version 5.3.3-7 squeeze15,并发现了一个看似非常重要的区别. 在我们的应用程序中,有些实例我们使用对象语法错误地调用了数组的索引: echo $array-index; 但是,5.2.
我们最近遇到了一场灾难,不得不将 PHP Web应用程序从 PHP Version 5.2.6-1 lenny16移到PHP Version 5.3.3-7 squeeze15,并发现了一个看似非常重要的区别.

在我们的应用程序中,有些实例我们使用对象语法错误地调用了数组的索引:

echo $array->index;

但是,5.2.6似乎原谅了这一点,并正确地将其视为$array [‘index’].

经过进一步测试,5.2.6具体做的是不同意5.3.3关于$array-> index是否为空();

这是我在两台服务器上运行的测试代码:

<?php

echo phpversion() . '<br>';

$array = array(
    'x' => 1,'y' => 2
);

if (!empty($array->x))
{
    echo "not empty";
}
else
{
    echo "empty";
}

?>

以下是两种不同的输出:

5.2.6-1+lenny16
not empty

5.3.3-7+squeeze15
empty

当然,现在有一些功能被破坏的爆发,因为我们在开发过程中从未提醒过这些错误.有没有办法我们可以配置php 5.3以允许这种不正确的语法,而我们需要更多的时间来找到它的所有不正确的实例?

我不认为这是配置问题,是吗?在版本之间,empty()的工作方式有所改变吗?

解决方法

我刚刚将您的示例代码放到PHP版本( test)的一般测试中,它表明您是正确的,存在差异:

从PHP 5.0.0到5.2.11(以及早期的5.3.0到5.3.1),这个“未定义属性”被报告为非空,这有资格作为缺陷或错误.

5.2.12(2009年12月17日)的相关变化为(ref):

  • Fixed bug 07002 (isset() and empty() silently casts array to object). (Felipe)

从技术上讲,这不是从PHP 5.2到5.3的向后不兼容的变化,因为它在两个分支中都是一个缺陷,并且在两个分支中都是固定的.如果您迁移,则很难发现,因为标准迁移指南不包括它们.相反,您需要完成软件的更改并查找票据的注释和参考.

所以回答你的问题:这是一个配置问题,因为使用的PHP版本算作配置.您更改了配置,然后遇到了问题.

同样如报告所示,这仅限于empty()和isset(),而不是一般对象/数组访问.你可以想象,如果情况确实如此,你会发现更多关于它的参考.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读