致命错误:嵌套级别太深 - 递归依赖?

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.

Richard Lord:"嵌套级别太深 - 递归依赖?"

PHP手册:"比较对象"

  • 好一个!这也适用于`in_array`并比较对象数组. (6认同)
  • 流感 - 你是我当时的英雄.一旦你阅读它就显而易见......谢谢! (3认同)
  • `array_search()`还有一个$ strict参数用于搜索对象数组. (2认同)

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的建议.