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

标签 php object

当我比较两个不同的对象时,它首先返回 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_tableproperties 是 PHP 用来表示属性的两种不同方式 - 前者效率更高,用于声明的属性,后者用于动态特性。 print_r 调用有效地使对象属性动态化。

关于php - 比较 PHP 对象时出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20913747/

相关文章:

php - 如何使用PHP向数据库中的2个表插入数据?

php - 碳 setLocale 不工作 Laravel

php - 网址编码 - 解码

php - MySQL 在 if 语句后停止运行查询

java - 试图理解从类图到对象图的转换过程

php - mysql select across 2 tables - 如果匹配值在另一个表中,则仅包括 1 中的行

jsf - 使用输入变量的值作为对象属性

arrays - 如何在swift 3中按自定义状态值对自定义对象数组进行排序?

javascript - Angular2/ typescript : How to get an array of objects through Pipe?

javascript - 如何在 Javascript 中操作我的深层嵌套 json?