PHP5.2允许对象语法调用数组索引吗?

PHP5.2允许对象语法调用数组索引吗?,php,arrays,object,Php,Arrays,Object,我们最近遇到了一场灾难,不得不将我们的php web应用程序从php版本5.2.6-1+lenny16迁移到php版本5.3.3-7+squeeze15,并发现了一个看似重要的差异 在我们的应用程序中,存在使用对象语法错误调用数组索引的实例: echo $array->index; 然而,5.2.6似乎原谅了这一点,并正确地将其视为编写了$array['index'] 经过进一步测试,5.2.6具体做的是不同意5.3.3关于$array->index是否为空() 以下是我在两台服务器上运

我们最近遇到了一场灾难,不得不将我们的php web应用程序从php版本5.2.6-1+lenny16迁移到php版本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";
}

?>
很自然,现在出现了一些功能中断的情况,因为我们在开发过程中从未被提醒这些错误。我们是否可以通过配置PHP5.3来允许这种不正确的语法,同时花更多的时间来查找所有不正确的实例


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

我刚刚对您的示例代码进行了跨PHP版本()的常规测试,结果表明您是正确的,存在以下差异:

从PHP 5.0.0到5.2.11(以及早期的5.3.0到5.3.1),此“未定义属性”被报告为非空,这不符合缺陷或bug的条件

5.2.12(2009年12月17日)中的相关变更为():

  • 修复了错误(
    isset()
    empty()
    以静默方式将数组强制转换为对象)。(费利佩)
从技术上讲,这不是从PHP5.2到5.3的向后不兼容的更改,因为这是两个分支中的一个缺陷,并且在两个分支中都已修复。如果进行迁移,则很难发现这些问题,因为标准迁移指南没有涵盖这些问题。取而代之的是,你需要检查软件的变化,并寻找票据的注释和参考

所以要回答您的问题:这是一个配置问题,因为所使用的PHP版本被视为配置。您更改了配置,然后出现了问题


正如报告所示,这仅限于
empty()
isset()
,而不是一般的对象/数组访问。您可以想象,如果是这样的话,您会找到更多关于它的参考资料。

您确定$array就是array吗?无法重现您的错误。你能提供复制的完整例子吗?
5.2.6-1+lenny16
not empty

5.3.3-7+squeeze15
empty