隐藏print_r或var_dump中的特定类字段

Ang*_*gas 12 php

是否可以隐藏print_r中的特定类字段?

<?php

class DataManager {
    public $data = array();
}

class Data {
    public $manager;
    public $data = array();

    public function Data ($m, $d) {
        $this->manager = $m;
        $this->data = $d;
    }
}

$manager = new DataManager();

for ($a = 0; $a < 10; $a++) {
    $manager->data[] = new Data($manager, 'Test ' . md5($a));
}

echo '<pre>';
print_r($manager);

?>
Run Code Online (Sandbox Code Playgroud)

这会打印出来

DataManager Object([data] => Array([0] => Data Object([manager] => DataManager Object RECURSION [data] => Test cfcd208495d565ef66e7dff9f98764da)

        [1] => Data Object
            (
                [manager] => DataManager Object  *RECURSION*
                [data] => Test c4ca4238a0b923820dcc509a6f75849b
            )    .......
Run Code Online (Sandbox Code Playgroud)

有可能以某种方式改变输出行为,所以它打印像这样吗?与DocComment/**@hidden**/一样

DataManager对象([data] =>数组([0] =>数据对象([数据] =>测试cfcd208495d565ef66e7dff9f98764da)

        [1] => Data Object
            (
                [data] => Test c4ca4238a0b923820dcc509a6f75849b
            )
Run Code Online (Sandbox Code Playgroud)

如果没有,是否有某种PHP库可能使用反射并以某种方式绕过东西?

谢谢

Duš*_*jka 26

新的Magic方法__debugInfo()是在PHP 5.6中引入的,它允许您在转储对象时修改var_dump()的默认行为.

看看文档.

例:

<?php
class C {
    private $prop;

    public function __construct($val) {
        $this->prop = $val;
    }

    public function __debugInfo() {
        return [
            'propSquared' => $this->prop ** 2,
        ];
    }
}

var_dump(new C(42));
?>
Run Code Online (Sandbox Code Playgroud)

返回:

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}
Run Code Online (Sandbox Code Playgroud)

虽然这个问题已经有4年了,但我相信将来会有人发现这个问题很有用.

  • "我相信将来有人会觉得这很有用" - 是的,我做过:) (6认同)
  • 如果你想隐藏一个特定的属性(比如'app'),这段代码可能会有用:`public function __debugInfo(){$ result = get_object_vars($ this); 未设置($结果[ '应用']); 返回$ result; } (5认同)