【问题标题】:print_r shows private var. Why?print_r 显示私有变量。为什么?
【发布时间】:2017-06-08 10:56:28
【问题描述】:

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

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);

【问题讨论】:

  • private 对象属性主要在类继承的上下文中,并且仅限于内部范围。
  • 不要假设private 意味着“安全”。它只是该属性应该如何使用的一个指标,它不提供任何实际的“安全性”或事实上的“真正的隐私”。
  • @deceze Private 意味着它只有在特定类中才能读取和更新 var 或函数的值。这就是为什么我想知道 print_r 怎么还能看到它

标签: php class echo private


【解决方案1】:

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

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


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

【讨论】:

  • 为什么不是静态类?
  • 谢谢你! :D @TheCrazyProfessor 这是一个好问题。
  • @TheCrazyProfessor 我认为这是一个内部存储的东西......例如也许 PHP 将带有类定义的静态变量存储在一个对象中,然后该类的实例在一个单独的对象中......如果你真的想要这些,你可以使用Reflection class(更多信息参见this answer
【解决方案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
)

【讨论】: