You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:20:35