PHP:如何使用__debuginfo捕获var_dump递归

yiytaume  于 2023-04-28  发布在  PHP
关注(0)|答案(1)|浏览(143)
var_dump

此函数显示有关一个或多个表达式的结构化信息,包括表达式的类型和值。数组和对象被递归地探索,值缩进以显示结构。
因为var_dump递归地探索对象,而__debuginfo可以用来改变var_dump的输出。
那么,是否可以检测var_dump递归开始的最上面的对象,并根据特定条件返回输出?
例如:

public function __debuginfo() {

   $debug = array(
     'name' => 'Ucscode',
     'profession' => 'programming'
   );
   
  if( $this != 'The object passed by user to var_dump' ) return $debug;

  return array('type' => "The object");

}

更新:

我试过这样的方法,效果很好

public function __debuginfo() {

    global $customDebugLevel; // a counter;
    if( is_null($customDebugLevel) ) $customDebugLevel = -1; // 1st init
    $customDebugLevel++; // increase per var_dump call

    $debug = array(
        'name' => 'Ucscode',
        'profession' => 'programming',
        'child' => $this->child
    );

    if( empty($customDebugLevel) ) return $debug;

    return array('type' => "The object");

}

但是问题是,如果在同一个类的示例上调用var_dump两次,它将不会重置$customDebugLevel,因此只有第一次var_dump调用才会产生正确的结果。

nkhmeac6

nkhmeac61#

我不认为有任何内在的方法。但是您可以在调用var_dump()之前将变量设置为顶级对象,并与之进行比较。

public function __debuginfo() {
  global $debug_object;
  if( $this != $debug_object ) {
    return array('type' => "recursion");
  } else return array('type' => "The object");
}
...
$debug_object = $my_object;
var_dump($my_object);

你可以把它封装在一个函数中:

function my_var_dump($object) {
    global $debug_object;
    $debug_object = $object;
    var_dump($object);
    $debug_object = null;
}

相关问题