
__debugInfo 用来定制 var_dump 输出内容
PHP 的 __debugInfo 是一个魔术方法,只在你调用 var_dump() 或 Xdebug 显示对象时生效。它不改变对象本身行为,也不影响 print_r()、json_encode() 或序列化——那些都走各自的逻辑。
典型使用场景:敏感字段(如密码哈希、API密钥)不该被直接打出来;或者对象内部用了大量私有资源(如 cURL 句柄、数据库连接),没法直接序列化,但你想让调试时看到关键业务状态。
- 必须返回
array,否则会触发致命错误Fatal error: __debugInfo() must return an array - 返回的数组键会被当作文本键名显示,值则按常规规则渲染(支持嵌套、引用、资源等)
- 如果没定义该方法,
var_dump()就老老实实输出所有 public 属性,private/protected 属性带类名前缀显示
不写 __debugInfo 时 var_dump 看到的是什么
默认情况下,var_dump() 对对象是“照单全收”的:public 属性明文列出,protected 属性显示为 *property_name,private 显示为 ClassName$property_name。如果对象里存了 resource 或 Closure,还会直接报错或显示为 Resource id #123 这种不可读形式。
比如一个简单类:
立即学习“PHP免费学习笔记(深入)”;
class User {
public $name = 'Alice';
private $password_hash = '$2y$10$...';
private $db_conn;
public function __construct() {
$this->db_conn = fopen('php://memory', 'r');
}
}
此时 var_dump(new User()) 会把 $password_hash 和 $db_conn 全抖出来——既不安全,也不实用。
__debugInfo 返回空数组或过滤字段的写法
最常见需求就是隐藏敏感字段、省略大体积数据、替换资源为可读描述。关键点在于:你控制返回什么,而不是怎么修改原始属性。
- 返回空数组
return [];,var_dump()就只显示类名和object(User)#1 (0) { },很干净 - 只暴露业务相关字段:
return ['name' => $this->name, 'id' => $this->id]; - 对资源做转换:
'db_status' => is_resource($this->db_conn) ? 'open' : 'closed' - 注意别在
__debugInfo()里调用可能抛异常的方法(比如检查一个已关闭的 resource),否则var_dump()会中断并报错
兼容性与容易踩的坑
__debugInfo() 从 PHP 5.6.0 开始支持,低于这个版本直接忽略(不报错,但也不起作用)。如果你项目还要跑在 PHP 5.4/5.5 上,不能依赖它做调试保护。
- Xdebug 2/3 都尊重这个方法,但旧版 Xdebug(如 2.2 之前)可能缓存过结果,改完记得重启 web server 或 CLI 进程
- 不要在
__debugInfo()里访问未初始化的属性,PHP 不会帮你兜底,直接Notice: Undefined property - 该方法不能是 static,不能带参数,声明必须严格为
public function __debugInfo(),加个&或void返回类型提示都会导致失效 - 某些 IDE(如 PhpStorm)的变量面板底层也调用
var_dump-like 机制,所以它会影响断点调试时看到的内容
真正麻烦的不是怎么写,而是团队里有人顺手在 __debugInfo() 里加了 file_get_contents('/tmp/big.log') —— 一调试就卡死,还查不出原因。











