在 PHP 面向对象编程中,self
、$this
和 parent
是三个常用的关键字,它们用于不同的上下文和场景。下面我将详细解释它们的区别和用法。
1. $this
$this
是一个指向当前对象的引用,用于在类的内部访问非静态属性和方法。
特点:
示例:
class MyClass {
private $property = 'value';
public function getProperty() {
return $this->property; // 访问当前对象的属性
}
public function callMethod() {
return $this->getProperty(); // 调用当前对象的方法
}
}
2. self
self
用于访问当前类的静态成员(属性和方法)和常量。
特点:
用于访问静态成员和类常量
在编译时解析,指向定义它的类
可以在静态和非静态方法中使用
常用于单例模式或工厂模式
示例:
class MyClass {
const CONSTANT = 'constant value';
public static $staticProperty = 'static';
public static function staticMethod() {
return self::$staticProperty; // 访问静态属性
}
public function getConstant() {
return self::CONSTANT; // 访问类常量
}
}
3. parent
parent
用于访问父类的成员(包括静态和非静态),通常在子类中覆盖父类方法时使用。
特点:
用于调用父类的方法或访问父类的属性
常用于子类扩展或修改父类行为时
可以访问父类的静态成员和非静态成员
示例:
class ParentClass {
protected $property = 'parent value';
public function getProperty() {
return $this->property;
}
}
class ChildClass extends ParentClass {
protected $property = 'child value';
public function getParentProperty() {
return parent::getProperty(); // 调用父类方法
}
public function getOriginalProperty() {
return parent::$property; // 访问父类属性(如果属性是静态的)
}
}
三者的比较
关键字 | 指向对象 | 可访问成员类型 | 使用场景 |
---|
$this | 当前对象实例 | 非静态成员 | 对象上下文中访问属性和方法 |
self | 当前类 | 静态成员和常量 | 类上下文中访问静态成员 |
parent | 父类 | 静态和非静态成员 | 子类中访问父类成员 |
使用注意事项
1、$this 与 self 的区别:
class Example {
public static $value = 'static';
public $value2 = 'non-static';
public function test() {
echo self::$value; // 正确 - 访问静态属性
echo $this->value2; // 正确 - 访问非静态属性
echo $this::$value; // 错误 - 不能这样混合使用
}
}
2、后期静态绑定:PHP 5.3+ 引入了 static
关键字,它与 self
类似但在继承中有不同的行为("延迟静态绑定")
3、parent
的使用限制:只能用于访问父类的成员,不能用于访问更高层级的祖先类
4、性能考虑:self
在编译时解析,比 $this
有轻微的性能优势,但差异通常可以忽略