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. 拓展:另外两个同类关键字
self:当前类;static:延迟静态绑定(继承场景用,子类重写常量时会取子类的值);- 类名:::硬编码指定某个类。
简单场景区分
- 单纯本类内部读常量:用
self:: - 有继承、子类会重写常量:用
static:: - 固定访问其他类常量:
OtherModel::XXX
来团QQ客服