4

我们最近遇到了一场灾难,不得不将我们的 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";
}

?>

这是两个不同的输出:

5.2.6-1+lenny16
not empty

5.3.3-7+squeeze15
empty

自然,现在有一些功能损坏的爆发,因为我们在开发过程中从未收到过这些错误的警报。有没有一种方法可以配置 php 5.3 以允许这种不正确的语法,同时我们需要更多的时间来查找它的所有不正确的实例?

我不认为这是一个配置问题,是吗?empty() 在版本之间的工作方式是否发生了变化?

4

1 回答 1

4

我刚刚对您的示例代码进行了跨 PHP 版本 ( test ) 的一般测试,它表明您是正确的,但存在差异:

从 PHP 5.0.0 到 5.2.11(以及早期的 5.3.0 到 5.3.1),这个“未定义属性”被报告为非空,这确实是一个缺陷或错误。

5.2.12(2009 年 12 月 17 日)的相关变化是(参考):

  • 修复了错误#50255isset()empty()默默地将数组转换为对象)。(费利佩)

从技术上讲,这不是从 PHP 5.2 到 5.3 的向后不兼容的更改,因为它在两个分支中都是一个缺陷,并且在两个分支中都已修复。如果您进行迁移,这些将更难发现,因为标准迁移指南并未涵盖它们。相反,您需要查看软件的更改并查找票据的注释和参考。

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

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

于 2013-06-23T10:19:06.917 回答