【问题标题】:PHP 5.2 permitted object syntax to call array index?PHP 5.2 允许对象语法调用数组索引?
【发布时间】:2013-06-03 06:09:51
【问题描述】:

我们最近遇到了一场灾难,不得不将我们的 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() 在版本之间的工作方式是否发生了变化?

【问题讨论】:

  • 你确定 $array 是数组吗?无法重现您的错误。您能提供完整的复制示例吗?

标签: php arrays object


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2011-10-02
    • 2011-03-29
    • 2021-03-27
    • 1970-01-01
    相关资源
    最近更新 更多