当我比较两个不同的对象时,它首先返回 true
,然后 print_r
(在对象上)返回 false
。
来自 PHP 手册:
Two object instances are equal if they have the same attributes and values, and are instances of the same class.
但在这里,例如,我设置了不同的值。为什么 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)
最佳答案
这是 PHP 中的一个错误。现在已修复,请参阅 commit .简而言之:
- 如果您扩展一个类并重新定义相同的属性,则对象的
properties_table
最终会具有 NULL 值。 - comparison code当两个对象在同一索引的
properties_table
中具有 NULL 值时,错误地中止比较 - 报告对象相等。这当然没有意义,因为它丢弃了以下属性中的所有差异。现在已修复。 print_r
改变结果的原因是通过获取对象的属性(get_properties
)重建属性哈希表(rebuild_properties_table
) 使用完全不同(且正确)的比较代码。- 对于上下文,
properties_table
和properties
是 PHP 用来表示属性的两种不同方式 - 前者效率更高,用于声明的属性,后者用于动态特性。print_r
调用有效地使对象属性动态化。
关于php - 比较 PHP 对象时出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20913747/