嵌套对象的 PHP 对象相等

标签 php oop reflection identity equality

是否有任何独立代码或独立框架中的库可用于比较包含其他对象引用的 PHP 对象?

equality运算符可用于测试对象身份。我正在寻找可以让我做这样的事情的代码

$a = new Foo;
$b = new Foo;

if(objectsAreEqual($a,b)
{
}

我知道我可以使用这样的东西

get_object_vars($a) == get_object_vars($b)

或其他形式的反射来比较属性,但如果对象包含嵌套对象,我们又回到身份问题。

所以,在我尝试自己实现之前,我想知道这是一个已解决的问题

最佳答案

我认为没有递归的方法可以做到这一点:

function objectsAreEqual($a, $b) {
    $aProps = get_object_vars($a);
    $bProps = get_object_vars($b);


    foreach($aProps as $k => $v) {
        // check if key exists in b
        if(!isset($bProps[$k]) { 
            return false; 
        }

        // check if they're equal (if not an object or array)
        if($v != $bProps[$k]) {
            return false;
        }

        // if $v is an object or array
        if(is_object($v) || is_array($v)) {
            return objectsAreEqual($v, $bProps[$k]);
        }  

    }   

    return true;
}

一定要测试一下,但我认为它应该有效。如果您需要在运行之前修复它,也请在此处编辑代码。

关于嵌套对象的 PHP 对象相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11457944/

相关文章:

php - 我应该创建额外的函数来使我的代码可测试吗?

php - 定义前的实例化类

php - 从子类 php 和 parent 关键字访问 parents 变量?

android - 如何让Android程序中的所有 Activity 都可以访问一个对象?

使用反射 $foo->$bar() 时性能中断

php - 我可以在 CakePHP 的更新语句中添加条件吗?

php - PHP 中的闭包或 create_function

c++ - 新建/删除运算符重载和基类

java - 使用 Java 8 lambda 表达式打印有关错误的调试信息

c# - 用于 Web 应用程序的 GetEntryAssembly