PHP中self、parent与this的区别详解

Nora
Nora
发布时间:2026-10-14| 5人浏览过
原创

本文详细解析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面向对象基础资料的关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。