Php 显示来自私有/受保护属性和方法的数据

Php 显示来自私有/受保护属性和方法的数据,php,exception,Php,Exception,我正在对一个对象执行print_r()。显示格式良好的输出。但是,我想控制输出。我希望能够格式化并向输出的某些部分添加标题/标题。print_r()非常棒,但我不知道如何访问输出中的不同行。 我试图做这样的事情: echo '<h1>ERRORS</h1>'; echo '<h3>Properties</h3>'; print_r(Exception::$message); 我不想访问$message来修改它。我只想像print_r()那样显示它

我正在对一个对象执行print_r()。显示格式良好的输出。但是,我想控制输出。我希望能够格式化并向输出的某些部分添加标题/标题。print_r()非常棒,但我不知道如何访问输出中的不同行。 我试图做这样的事情:

echo '<h1>ERRORS</h1>';
echo '<h3>Properties</h3>';
print_r(Exception::$message);
我不想访问$message来修改它。我只想像print_r()那样显示它……但格式很好。也许我还没有完全理解“访问”的真正含义

我也试过这样的方法:

$lines = explode("\n", print_r(Exception::$message, true));
foreach ($lines as $line) {
    echo $line;
}
…但我也犯了同样的错误

Fatal error: Cannot access protected property Exception::$message...
有办法做到这一点吗?或者有没有一种方法可以正确访问print\u r()的内容?

print\u r()
以及
var\u dump()
都只是为了调试,所以它从来就不是为了看起来好看

然而,如果您想输出一个更“漂亮”的对象,您需要自己构建它。看一看这张照片


您不应该将此类(调试)输出留在生产服务器上

print\r的输出是一段纯文本,您无法控制它——它只是某个变量或对象内容的转储。如果您想要格式化,您必须滚动您自己的print\r版本,特别是如果您想要处理对象的受保护/私有部分。由于它们受到保护,因此无法从对象外部访问它们

e、 g

不起作用,因为在访问该变量时,您不在对象的“内部”。您必须向对象添加“dump”方法:

 $x = new MyObj;
 $x->dump('some_protected_variable');

并使用转储功能进行访问/转储。

太棒了!非常感谢。很好的信息,关于访问受保护的方法和属性,您是绝对正确的。我使用了反射API。我已经推出了自己的异常处理程序。但是,现在我将集成许多优秀的反射特性。谢谢你的帮助!谢谢马克的格式化。我以为我的格式正确。懒散的发帖…我道歉。
 $x = new MyObj;
 print_r($x::some_protected_variable);
 $x = new MyObj;
 $x->dump('some_protected_variable');