×
微信咨询
微信二维码

长按图片识别添加或保存到相册

产品服务 帮助文档

PHP中self和this的用法区别

PHP中self和this的核心区别在于self指向当前类本身,用于访问类常量、静态属性和静态方法,而this指向实例对象,只能访问实例属性。访问类常量应使用self::,继承场景可用static实现延迟静态绑定。

public function scopeVideoGroup(Query $query, int $wxappId): Query
    {
        return $query->where('wxapp_id', $wxappId)
            ->where('group_type', self::GROUP_TYPE_VIDEO)
            ->where('is_delete', 0);
    }

1. self 是什么

self 代表当前这个类本身(VideoGroup 模型类),是类内部访问类常量、静态属性、静态方法的关键字。

和 $this 区分开(重点)

  • $this:指向实例对象,只能在普通成员方法里用,访问实例属性;
  • self:指向类本身,访问类常量 / static 静态变量 / 静态方法。

2. self::GROUP_TYPE_VIDEO 拆解

const GROUP_TYPE_VIDEO = 'video';

这行是类常量,属于类,不属于某个实例。

  • GROUP_TYPE_VIDEO:常量名;
  • :::范围解析操作符,用来取类的常量/静态成员;
  • self = 当前 VideoGroup 类。

等价完整写法:

VideoGroup::GROUP_TYPE_VIDEO

但如果类名改了(比如以后重命名 VideoGroup),硬写类名要全部改;用 self 不用改,自动指向当前类。

3. 为什么这里不能用 $this::GROUP_TYPE_VIDEO

常量是属于类的,不是属于某个对象实例:

  • $this 是实例,$this::常量 语法虽不报错,但语义不规范;
  • 规范:访问类常量一律用 self::。

4. 补充对比示例

class VideoGroup
{
    // 类常量(归属于类)
    const GROUP_TYPE_VIDEO = 'video';

    // 实例属性(归属于对象)
    public string $group_name;

    public function scopeVideoGroup(Query $query, int $wxappId): Query
    {
        // 取当前类的常量 → self::
        echo self::GROUP_TYPE_VIDEO;

        // 取当前对象的实例属性 → $this->
        echo $this->group_name;

        return $query;
    }
}

5. 拓展:另外两个同类关键字

  1. self:当前类;
  2. static:延迟静态绑定(继承场景用,子类重写常量时会取子类的值);
  3. 类名:::硬编码指定某个类。

简单场景区分

  • 单纯本类内部读常量:用 self::
  • 有继承、子类会重写常量:用 static::
  • 固定访问其他类常量:OtherModel::XXX
大纲

文章目录

    联系我们
    联系方式
    • 官方服务热线:17721141027
    • 邮箱:kf@ilaituan.com
    • QQ:20262336
    扫码添加客服
    微信
    联系我们