$this指向当前对象实例,用于访问非静态成员;self是类名别名,用于静态上下文访问静态属性、方法和常量;static支持后期静态绑定,parent::用于显式调用父类静态成员。

在PHP类中,$this 和 self 分别代表不同的作用域绑定对象,混淆使用会导致调用失败或逻辑错误。以下是区分二者并正确调用类成员的具体方法:
一、$this用于访问当前实例的非静态成员
$this 是一个指向当前对象实例的引用,仅可在对象上下文中使用,用于访问该实例的属性和方法,不能用于静态上下文。
1、在类的方法中,使用 $this->属性名 访问当前对象的公有或受保护属性。
2、在类的方法中,使用 $this->方法名() 调用当前对象的公有或受保护实例方法。
立即学习“PHP免费学习笔记(深入)”;
3、在构造函数或普通方法中,若需返回当前对象以支持链式调用,必须使用 return $this;。
4、在类外部创建对象后,只能通过对象变量调用 $this 所关联的成员,例如 $obj->publicMethod()。
二、self用于访问当前类的静态成员
self 是一个类名的别名,指向定义该代码的类本身(非运行时动态类),仅用于静态上下文,可访问静态属性、静态方法及常量,不依赖对象实例。
1、在类内部,使用 self::$staticProperty 访问当前类声明的静态属性。
2、在类内部,使用 self::staticMethod() 调用当前类定义的静态方法。
3、在类内部,使用 self::CONSTANT_NAME 引用当前类定义的类常量。
4、self 不可用于访问实例属性或实例方法,否则会触发致命错误 Fatal error: Using $this when not in object context。
三、static关键字与后期静态绑定(static::)的补充用法
当存在继承关系且需在父类中调用子类重写的静态成员时,self 会始终绑定父类,而 static 支持后期静态绑定,指向实际运行时的类。
1、在父类方法中,使用 static::$property 可访问子类中覆盖的静态属性值。
2、在父类方法中,使用 static::method() 可调用子类中重写的静态方法。
3、在子类中显式调用父类静态成员时,应使用 parent::method(),而非 self:: 或 static::。
4、static:: 在非静态方法中合法,但不可在纯静态方法中使用 $this。
四、类外部调用方式的严格区分
类外部无法直接使用 $this 或 self,必须通过明确语法标识调用目标。
1、调用实例成员时,必须先实例化: $obj = new ClassName(); $obj->instanceMethod();。
2、调用静态成员时,使用双冒号语法: ClassName::staticMethod(); 或 ClassName::$staticProp;。
3、外部不可使用 self,该关键字仅限类内部使用;外部也不可使用 $this,因无当前对象上下文。
4、若在外部函数中需操作类成员,必须显式传入对象实例或类名字符串,再通过变量语法间接调用。











