Alm*_* Do 11 php comparison object circular-reference
细节
首先,在我的情况下,"相等"的定义是 - 当对象具有相同的结构和该结构的值时,它们是相等的.但是,它们可能不是同一个实例,或者属性可能不在同一个"顺序"(我的意思是,因为它们被分配/定义).这里有类似的问题,就像这样 - 但它们并没有涵盖我的情况.
由于我的代码测试目的,我需要比较PHP中的实体 - 这些实体可能是任何东西.特别是,它们可能是物体.然而,对象比较并不"安全".想象一下,你正在比较:
$result = $objectX == $objectY;
Run Code Online (Sandbox Code Playgroud)
如果对象具有循环引用,这可能会导致致命错误.我在这里准备的简单例子.正如我们所看到的,PHP试图遵循嵌套级别并在无限循环中失败 - 因为自然对象在内容上是相同的,但具有循环引用.
重要的细节是对象可能包含不可序列化的东西(如闭包),这使得无法依赖"seralize/unserialize"方法(即使忘记了无序的比较)
目前的做法
我有这样的代码本(相当过分,直接粘贴在这里,但为了以防万一,这里是一个要点) -所以我表演DFS有接球这样的循环引用的情况.正如你所看到的,它非常复杂 - 顺便说一下,它很慢.
当前方法的另一个问题是 - 当对象内部有数组时,它们将在元素顺序方面进行比较,在某些情况下,这对我来说不合适(理想情况 - 当我能够切换顺序时 - 明智的比较),但为了克服它本身,我可能需要以某种方式"排序"数组 - 我不知道如何做到这一点 - 因为,再次,这些数组元素的比较将是不安全的.
而且,循环数组引用也会导致失败:
$array = ['foo', $object, &$array];
Run Code Online (Sandbox Code Playgroud)
题
什么是解决问题的其他(更好)方法?序列化对象可能就是这种情况,但由于非有序的属性集,它将失败.
你知道 Doctrine\Common\Util\Debug::export($class, $maxDepth) 吗?
该方法“导出”可以防止您无限循环并返回一个可用于进行差异的数组。
超过一定深度,没有必要进一步,使用 $maxDepth 您可以指定比较的“准确性”。
| 归档时间: |
|
| 查看次数: |
857 次 |
| 最近记录: |