print_r显示私有var。为什么?

时间:2017-01-23 20:07:56

标签: php class echo private

为什么reopen可以看到私有属性 $ version ,即使其范围设置为 private

print_r

2 个答案:

答案 0 :(得分:7)

print_r()显示私有成员属性以进行调试。它不应该用于输出对象以用于显示目的(例如在视图/页面中)。要显示有关对象的信息,可能需要创建一个返回相应信息的方法(例如 toString )。

  

print_r(),var_dump()var_export()也会显示对象的受保护和私有属性。静态类成员将不会显示。 1

1 <子> http://php.net/manual/en/function.print-r.php#refsect1-function.print-r-description

答案 1 :(得分:2)

此外,从PHP 5.6.0开始,您可以使用__debugInfo(),这样您就可以覆盖或优化print_r()var_dump()输出。

因此,例如,使用json编码和解码,您只能返回公共属性。

<?php
class myClass {

    private $private_var;

    public $public_var = 'Foobar';

    public function setPrivate($value)
    {
        $this->private_var = $value;
    }

    public function __debugInfo()
    {
        return json_decode(json_encode($this), true);
    }
}

$class = new myClass();
$class->setPrivate("Baz");

print_r($class);

https://3v4l.org/seDI6

<强>结果:

myClass Object
(
    [public_var] => Foobar
)