Mar*_*ker 23 php oop recursion hierarchical-data
我有一个复杂的嵌套对象层次结构,所有子对象(存储在父类中的对象数组)包含一个链接回其父级的属性:相当简单和直接,没有实际问题.如果我对层次结构中的任何对象执行var_dump,我将在转储中获得递归引用,正如我所期望的那样.
FIRSTGEN
_children array of objects of type SECONDGEN
SECONDGEN #1
_parent object of type FIRSTGEN
_children array of objects of type THIRDGEN
THIRDGEN #1
_parent object of type SECONDGEN
THIRDGEN #2
_parent object of type SECONDGEN
SECONDGEN #2
_parent object of type FIRSTGEN
_children array of objects of type THIRDGEN
THIRDGEN #3
_parent object of type SECONDGEN
Run Code Online (Sandbox Code Playgroud)
我最近在该层次结构中添加了一些新元素,但它们并没有遵循相同的模式.它们存储在顶级父级的对象数组中,但包含一个属性,将它们链接回来,而不是它们的父级,而是一个兄弟级.当我现在执行var_dump时,我得到一个"致命错误:嵌套级别太深 - 递归依赖?".
FIRSTGEN
_children_1 array of objects of type SECONDGEN_1
SECONDGEN_1 #1
_parent object of type FIRSTGEN
_children array of objects of type THIRDGEN
THIRDGEN #1
_parent object of type SECONDGEN_1
THIRDGEN #2
_parent object of type SECONDGEN_1
SECONDGEN_1 #2
_parent object of type FIRSTGEN
_children array of objects of type THIRDGEN
THIRDGEN #3
_parent object of type SECONDGEN_1
_children_2 array of objects of type SECONDGEN_2
SECONDGEN_2 #1
_parent object of type SECONDGEN_1
Run Code Online (Sandbox Code Playgroud)
除了var_dump()之外,代码中的其他所有内容都能正常工作.我已经尝试创建一个更简单的例子来演示这个问题,这样我就可以在提出这个问题时提供一个例子; 但是在短期测试中无法复制它,只能在我更复杂的代码中复制它.
我知道解决方案是重构关系,以便我的_children_2数组SECONDGEN_2对象保存在相应的SECONDGEN_1父级中,使父关系"正确"......我已经开始这样做了.但是,我对错误很感兴趣,并想知道是否有其他人遇到过它(以及你自己如何处理它).
flu*_*flu 80
==而不是使用比较递归对象,也会出现这种情况===如果需要比较实际对象实例,请始终使用严格比较运算符,===因为它仅比较对象是否引用同一类的同一实例.
简短说明:
如果使用比较对象$object == $objectToCompareWith,PHP会将第一个对象的每个属性和值与第二个对象进行比较.这种比较是对象的递归,这些对象是被比较对象的属性.
这意味着如果两个对象共享一个以对象作为其值的属性,PHP会对==这些属性对象进行相同的比较.现在,只要那些属性对象是递归的(例如,自引用对象),比较就会向下递归,直到达到最大嵌套级别.
正如Josh Stuart和mazatwork的评论中所述,当使用数组函数时,可以强制进行严格的比较,in_array()并将array_search()其各自的$strict参数设置为true.
Fan*_*nis 10
看起来像一个PHP限制在自引用代码,并试图用其显示print_r,var_dump,var_export,或通过它搜索in_array.基本上,如果对象被循环引用,那么这些函数无法知道在何处停止递归.
$outText = var_export( $GLOBALS, true );
print_r($outText) ;
Run Code Online (Sandbox Code Playgroud)
其他错误报告也提到了它,还有一些测试用例.我会说,如果这只是触发var_dump你不应该太担心它.如果这是出于调试目的,我肯定是第二个Wrikken关于xdebug的建议.