Laravel中dump对象的+/-/#及无前缀标识含义与PHP实现方法
Laravel中dd输出Carbon属性前缀及自定义无前缀调试属性
一、属性前缀的含义
+:对应**public(公共)**类属性,是类中直接声明的公共成员-:对应**private(私有)**类属性,仅能在类内部访问#:对应**protected(受保护)**类属性,可在类内部及子类中访问- 无前缀:这类不是类中真实定义的属性,是通过魔术方法动态生成的虚拟属性。比如Carbon里的
year、month等,本质是通过__get魔术方法动态返回的计算值,并非类本身的成员变量,所以调试输出时没有前缀标识。
二、自定义对象实现无前缀调试属性
要让自己的PHP对象在dd/var_dump时显示无前缀的虚拟属性,需要实现两个魔术方法:
1. 用__get处理虚拟属性访问
这个方法会在访问类中不存在的属性时触发,用来返回自定义的虚拟属性值:
class CustomObject { private $internalData = ['virtualAttr' => '我是虚拟属性']; public function __get($name) { // 判断是否是我们定义的虚拟属性 if (array_key_exists($name, $this->internalData)) { return $this->internalData[$name]; } return null; } }
2. 用__debugInfo自定义调试输出
默认情况下,dd只会显示类的真实属性。通过__debugInfo可以自定义调试时展示的内容,让虚拟属性也能被输出,并且是无前缀的:
class CustomObject { private $internalData = ['virtualAttr' => '我是虚拟属性']; public $publicAttr = '公共属性'; private $privateAttr = '私有属性'; protected $protectedAttr = '受保护属性'; public function __get($name) { if (array_key_exists($name, $this->internalData)) { return $this->internalData[$name]; } return null; } public function __debugInfo() { // 组合真实属性和虚拟属性,生成调试输出内容 return [ 'publicAttr' => $this->publicAttr, 'privateAttr' => $this->privateAttr, 'protectedAttr' => $this->protectedAttr, 'virtualAttr' => $this->virtualAttr // 加入虚拟属性 ]; } }
测试代码:
$obj = new CustomObject(); dd($obj);
此时输出里的virtualAttr就会是无前缀的,和Carbon中的动态属性表现一致。
内容的提问来源于stack exchange,提问作者dipesh pokhrel
相关产品推荐
相关产品推荐

