print_r显示私有var.为什么?

Ben*_*n H 4 php private class echo

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

class myClass {

    private $version;

    public function set_version($value){
        $this->version = $value;
    }


}



$class = new myClass();
$class->set_version("1.2");

echo "<pre>";
print_r($class);
Run Code Online (Sandbox Code Playgroud)

Sᴀᴍ*_*ᴇᴌᴀ 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)


Law*_*one 5

此外,从 PHP 5.6.0 开始,您可以使用__debugInfo(),这将允许您覆盖或优化 what 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);
Run Code Online (Sandbox Code Playgroud)

https://3v4l.org/seDI6

结果:

myClass Object
(
    [public_var] => Foobar
)
Run Code Online (Sandbox Code Playgroud)