当我比较两个不同的对象时,它首先返回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)
答案 0 :(得分:26)
这是PHP中的一个错误。它已修复,请参阅commit。简而言之:
properties_table
最终会具有NULL值。properties_table
中具有NULL值时,comparison code错误地中止了比较 - 将对象报告为相等。这当然没有意义,因为它丢弃了以下属性中的所有差异。现在已修复。print_r
更改结果的原因是,通过获取对象的属性(get_properties
)重建属性哈希表(rebuild_properties_table
),使用完全不同(并且正确) )比较代码。properties_table
和properties
是PHP用于表示属性的两种不同方式 - 前者更有效,用于声明属性,后者用于动态属性。 print_r
调用有效地使对象属性变为动态。答案 1 :(得分:4)
好吧,好吧,在php https://bugs.php.net/bug.php?id=66286中被识别为错误。