比较 PHP 对象时出现意外结果

2022-08-30 16:42:30

当我比较两个不同的对象时,它首先返回,而不是在(对象上)返回之后。trueprint_rfalse

从 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)

答案 1

这是PHP中的一个错误。它现在已经修复了,请参阅提交。总之:

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

答案 2

好吧,好吧,在php https://bugs.php.net/bug.php?id=66286 中被识别为错误。

同样在这里:比较PHP对象时的意外结果


推荐