【问题标题】:Unexpected result when comparing PHP objects比较 PHP 对象时出现意外结果
【发布时间】:2014-01-21 17:15:18
【问题描述】:

当我比较两个不同的对象时,它首先返回true,然后在print_r(对象上)返回false

来自 PHP 手册:

如果两个对象实例具有相同的属性和值,并且是同一类的实例,则它们是相等的。

但是在这里,例如,我设置了不同的值。为什么 PHP 5.4.0 - 5.5.7 的结果不同?

abstract class first
{
    protected $someArray = array();
}     

class second extends first
{    
    protected $someArray = array();        
    protected $someValue = null;

    public function __construct($someValue)
    {
        $this->someValue = $someValue;
    }
}

    $objFirst = new second('123');       
    $objSecond = new second('321');       

    var_dump ($objFirst == $objSecond);    
    print_r($objFirst);    
    var_dump ($objFirst == $objSecond);

结果是:

 bool(true)
 second Object ( [someArray:protected] =>
 Array ( ) [someValue:protected] => 123 )
 bool(false)

但我的预期是:

  bool(false)
  second Object ( [someArray:protected] =>
  Array ( ) [someValue:protected] => 123 )
  bool(false)

【问题讨论】:

  • 好吧,我确认一下。请参阅3v4l.org/B6qrN - 从 5.4.0 开始,它给出了真/假。奇怪
  • 这一定是php中的一些错误。我已经交换了第二类属性的声明顺序,我们到处都是假/假:3v4l.org/6VQ14
  • 实际上 print_r 似乎正在影响行为 - 3v4l.org/Z8l7r
  • 不能再用当前主复制。 (又名错误修复)
  • @Nadir-Sampaoli - 除了你的滑稽评论,看看这个错误在被识别后修复的速度有多快

标签: php object


【解决方案1】:

好吧,确定为 php https://bugs.php.net/bug.php?id=66286 中的错误。

也在这里:Unexpected result when comparing PHP objects

【讨论】:

    【解决方案2】:

    这是 PHP 中的一个错误。现在已修复,请参阅commit。简而言之:

    • 如果您扩展一个类并重新定义相同的属性,则对象的properties_table 最终将具有 NULL 值。
    • 当两个对象在同一索引处的properties_table 中具有NULL 值时,comparison code 错误地中止比较- 报告对象相等。这当然没有意义,因为它丢弃了以下属性中的所有差异。现在已修复。
    • print_r 改变结果的原因是,通过获取对象的属性 (get_properties),属性哈希表被重建 (rebuild_properties_table),它使用完全不同(且正确)的比较代码。李>
    • 对于上下文,properties_tableproperties 是 PHP 用来表示属性的两种不同方式 - 前者效率更高,用于声明的属性,后者用于动态属性。 print_r 调用有效地使对象属性动态化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-25
      • 2014-09-27
      • 2019-12-21
      • 2010-11-09
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多