PHP中self、parent与this的区别详解
本文详细解析PHP面向对象编程中this、self和parent三个关键字的区别。this指向当前对象实例,需实例化后使用;self访问本类(含继承的)静态成员,无需实例化;parent仅用于调用父类的静态或非静态成员。通过代码实例说明三者在不同上下文中的权限与限制。
核心概念简述
在PHP的面向对象开发中,理解这三个关键字的作用范围是避免运行时错误的关键。
- $this:特殊变量,代表“调用该方法的对象”。它不是关键字,而是伪变量。只能在对象的方法中使用,不能用于静态方法或独立脚本。
- self:关键字,代表“当前类本身”。主要用于访问本类定义的静态属性、常量和方法。也可以通过它访问父类中非私有的静态成员(但不推荐混淆)。使用self时,不需要实例化对象。
- parent:关键字,代表“直接父类”。专门用于在子类中调用被覆盖的父类方法或访问父类的静态/非静态成员。同样不需要实例化即可使用。
代码实例演示
以下代码定义了父类 test 和子类 test1,展示了各关键字在实际操作中的应用及报错场景。
<?php
class test {
public $public;
private $private;
protected $protected;
static $instance;
static $good = 'tankzhang';
public $tank = 'zhangying';
public function __construct() {
$this->public = 'public';
$this->private = 'private';
$this->protected = 'protected';
}
// 单例模式逻辑示例
public function tank() {
if (!isset(self::$instance[get_class()])) {
$c = get_class();
self::$instance = new $c;
}
return self::$instance;
}
public function pub_function() {
echo "you request public function
第1步:实例化对象并调用方法 ($this 的使用)
当需要访问对象的属性或非静态方法时,必须通过实例化的对象来调用。
$test = new test1();
$test->tank(); // 输出:public, protected, ying, you request protected function...
分析:在 $test->tank() 执行时,tank 方法内部的 $this 指向 $test 这个具体对象实例。因此,$this->public 等属性访问是合法的。$this 可以访问本类和父类中具有访问权限(public/protected)的非静态成员。
第2步:静态调用查看属性访问 (self 与 parent 的区别)
尝试通过类名直接调用非静态方法或访问非静态属性。
test1::test1_function();
分析:此步骤会触发警告:Non-static method test::test1_function() should not be called statically(取决于PHP版本和配置,可能报错也可能警告)。
在 test1_function 内部:
- self::$love:正确输出 tank,因为 $love 是本类静态变量。
- self::$good:正确输出 tankzhang,self 可以访问本类及父类可见的静态成员。
- parent::$good:正确输出 tankzhang,parent 引用父类 test 的静态成员。
- $tank 相关报错:代码注释指出,$tank 是动态声明的属性(虽然在类中定义,但通常不视为静态常量),若用 :: 静态调用方式访问且未定义为 static,会报 Fatal error: Access to undeclared static property。
第3步:在非实例上下文中使用 $this (常见错误)
尝试在静态方法或未实例化的上下文中直接使用 $this。
test1::extends_function(); // Fatal error: Using $this when not in object context
分析:当执行 test1::extends_function() 时,由于没有实例化对象,环境中不存在 “当前对象”。
- parent::sta_function():成功,因为它是调用父类的静态方法。
- self::pro_function():虽然语法上允许静态调用非静态方法(旧版PHP或特定配置下可能只是警告),但进入 pro_function 内部后,执行 echo $this->protected; 时,因缺乏对象上下文而抛出致命错误 Fatal error: Using $this when not in object context。
这证明了 $this 绝对不能在没有实例化对象的语境中使用。
总结对比表
| 关键字 | 作用对象 | 是否需要实例化 | 典型应用场景 |
|---|---|---|---|
$this |
当前实例对象 | 是 | 访问非静态属性/方法 |
self |
当前类自身 | 否 | 访问本类静态属性/常量/方法 |
parent |
直接父类 | 否 | 调用父类被重写的方法或属性 |
以上就是PHP类中self、parent、this的区别以及实例介绍的详细内容,更多关于PHP面向对象基础资料的关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









