PHP中self与$this的区别详解
在PHP面向对象编程中,正确使用 self 和 $this 是理解类机制的关键。许多开发者容易将二者混淆,但它们在作用范围和使用场景上有本质区别。本文将结合代码实例,详细解析 parent、self 与 $this 的差异。
预备知识:继承中的关键字
在深入对比之前,简要回顾一下PHP继承关系中的几个关键保留字:
parent:指向直接父类。常用于在子类构造函数或方法中调用父类的同名方法或属性。self:指向当前类本身(定义时的类)。它不随调用对象的变化而变化,主要用于访问静态成员、常量以及当前类内的其他静态方法。$this:指向当前实例化的对象。它只能在非静态上下文中使用,用于访问对象的属性和动态方法。
代码示例解析
以下示例展示了一个基类 A 和一个继承自 A 的子类 B。我们将观察在不同语境下各个关键字的行为。
<?php
/*
* 基类 A
*/
class A {
function __construct() {
echo "基类A的构造方法<br />";
}
}
/*
* 子类 B 继承自 A
*/
class B extends A {
function __construct() {
// 调用父类 A 的构造函数
parent::__construct();
echo "子类B的构造方法<br />";
// 注意:这里调用的是非静态方法 myFun
// 虽然使用了 self::,但因为方法是非静态的,实际上会发生隐式转换或报错(取决于PHP版本和上下文)
// 但在本例的简单结构中,通常建议静态调用用 static:: 或 self::针对静态方法,实例调用用 $this->
// 此处原意可能是演示 self 指向当前类 B
self::myFun();
}
function myfun() { // 注意方法名大小写不一致,PHP中方法名不区分大小写,但建议统一
echo "一个普通方法myFun()<br />";
}
}
// 实例化操作
$objA = new A();
$objB = new B();
?>
核心区别:self vs $this
尽管 self 和 $this 看起来相似,但它们解决的问题完全不同:
1. 作用对象不同
self更像“类本事”:它引用的是定义该代码块的类结构。无论你将类实例化为哪个对象,self始终指向编写代码时所在的那个类。$this更像是“实例本身”:它引用的是运行时刻具体的对象实例。不同的对象实例拥有独立的$this引用。
2. 访问权限限制
$this的限制:$this不能 引用静态成员(静态属性或静态方法)和常量。因为静态内容属于类而非特定实例,在对象创建之前它们就已经存在了。self的使用:self专门用于访问类的静态成员、常量以及调用静态方法。例如:self::$staticVar或self::CONSTANT_NAME。
3. 多态性与绑定
当涉及继承时,如果子类重写了某个方法:
- 使用
$this->methodName()会触发晚绑定(Late Static Binding),即调用当前对象的实际类型的方法。 - 使用
self::methodName()会强制调用定义该代码所在的类中的方法版本,即使是在子类中被调用。如果需要更灵活的多态行为,应使用static::(PHP 5.3+)。
总结与建议
在开发过程中,请遵循以下原则:
- 访问非静态属性和方法,且需要区分具体对象行为时,使用
$this->。 - 访问静态属性、常量或在类内部统一调用静态方法时,使用
self::。 - 需要调用父类被重写的方法时,使用
parent::。 - 需要实现真正的多态调用(根据实际运行对象类型决定方法)时,考虑使用
static::替代self::。
以上就是 self 与 $this 的详细区别与应用的完整内容,更多关于 PHP 面向对象编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









