print_r 显示私有变量。为什么?
print_r shows private var. Why?
为什么 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);
print_r()
显示用于调试目的的私有成员属性。它不应用于出于显示目的输出对象(例如在 view/page 中)。要显示有关对象的信息,创建一个方法(例如 toString)可能是合适的,该方法将 return 适当的信息。
print_r(), var_dump() and var_export() will also show protected and private properties of objects. Static class members will not be shown.1
1http://php.net/manual/en/function.print-r.php#refsect1 -功能.print-r-描述
此外,从 PHP 5.6.0 开始,您可以使用 __debugInfo(),这将允许您覆盖或优化 print_r()
、var_dump()
输出。
因此,例如,使用 json 编码和解码,您只能 return public 属性。
<?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);
结果:
myClass Object
(
[public_var] => Foobar
)
为什么 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);
print_r()
显示用于调试目的的私有成员属性。它不应用于出于显示目的输出对象(例如在 view/page 中)。要显示有关对象的信息,创建一个方法(例如 toString)可能是合适的,该方法将 return 适当的信息。
print_r(), var_dump() and var_export() will also show protected and private properties of objects. Static class members will not be shown.1
1http://php.net/manual/en/function.print-r.php#refsect1 -功能.print-r-描述
此外,从 PHP 5.6.0 开始,您可以使用 __debugInfo(),这将允许您覆盖或优化 print_r()
、var_dump()
输出。
因此,例如,使用 json 编码和解码,您只能 return public 属性。
<?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);
结果:
myClass Object
(
[public_var] => Foobar
)