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

ser*_*gio 26 php object

当我比较两个不同的对象,它返回首先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);
Run Code Online (Sandbox Code Playgroud)

结果是:

 bool(true)
 second Object ( [someArray:protected] =>
 Array ( ) [someValue:protected] => 123 )
 bool(false)
Run Code Online (Sandbox Code Playgroud)

但我的期望是:

  bool(false)
  second Object ( [someArray:protected] =>
  Array ( ) [someValue:protected] => 123 )
  bool(false)
Run Code Online (Sandbox Code Playgroud)

Nik*_*kiC 26

这是PHP中的一个错误.它现在已修复,请参阅提交.简而言之:

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