编程 掌握 PHP 静态成员:self::, parent::, static:: 详解

2024-11-18 23:48:19 +0800 CST views 715

掌握 PHP 静态成员:self::, parent::, static:: 详解

在 PHP 中,静态成员(包括方法和属性)直接隶属于类,而非类的实例对象。这意味着我们无需实例化对象,就能直接访问类的静态成员。这一特性在需要跨对象共享数据或功能时尤为有用。

PHP 提供了 self::parent::static:: 三个关键字来访问静态成员,它们在继承关系中的工作机制不同。本文将深入解析这三个关键字的运作原理,并结合实例阐明它们之间的区别。

何时使用静态成员

  • 模拟全局变量:将静态属性视为类内部的全局变量,所有实例都能共享访问。
  • 提供工具方法:静态方法适用于提供独立于具体对象实例的实用功能。
  • 定义类常量:使用静态属性定义类级别常量,确保其值在整个应用生命周期内保持不变。
  • 实现单例模式:静态方法和属性是实现单例模式(确保一个类只有一个实例)的关键要素。

调用静态方法

要调用静态方法,请使用 :: 运算符,后跟方法名称。以下是示例:

class MyClass {
    public static function greet() {
        echo "Hello, world!";
    }
}

MyClass::greet(); // 输出: Hello, world!

调用静态属性

要访问静态属性,也可以使用 :: 运算符,后跟属性名称。以下是示例:

class MyClass {
    public static $count = 0;

    public static function incrementCount() {
        self::$count++;
    }
}

MyClass::incrementCount();
echo MyClass::$count; // 输出: 1

self::、parent:: 和 static:: 三个关键字详解

1. self::

self:: 关键字始终指向定义该方法的类本身,不考虑任何继承关系。即使子类重写了父类的静态方法或属性,self:: 仍然会引用父类中定义的版本。

2. parent::

parent:: 关键字用于从直接父类中调用静态方法或属性。它会绕过子类中的重写,确保使用的是父类的版本。

3. static::

static::self:: 类似,但它引入了后期静态绑定(Late Static Binding)机制。这意味着 static:: 会根据运行时环境动态地绑定到最派生类中的静态方法或属性,即使调用代码位于父类中。

举例说明差异

示例 1:使用 self::

class A {
    public static function sayHello() {
        return "Hello from A";
    }

    public static function test() {
        return self::sayHello();
    }
}

class B extends A {
    public static function sayHello() {
        return "Hello from B";
    }
}

echo B::test(); // 输出: "Hello from A"

在这个例子中,self::sayHello() 出现在类 A 中,因此 self:: 指向的是类 A。本质上,self:: 不考虑子类是否重写了方法,直接调用父类中的方法。

示例 2:使用 parent::

class A {
    public static function sayHello() {
        return "Hello from A";
    }
}

class B extends A {
    public static function sayHello() {
        return parent::sayHello() . " and B";
    }
}

echo B::sayHello(); // 输出: "Hello from A and B"

在这个例子中,类 B 中的 parent::sayHello() 调用了父类 A 的 sayHello() 方法,程序先输出父类的结果,再拼接上类 B 自己的消息。

示例 3:使用 static::

class A {
    public static function sayHello() {
        return "Hello from A";
    }

    public static function test() {
        return static::sayHello();
    }
}

class B extends A {
    public static function sayHello() {
        return "Hello from B";
    }
}

echo B::test(); // 输出: "Hello from B"

在这段代码中,虽然 static::sayHello() 位于类 A 中,但由于 static:: 引入了后期静态绑定,它会根据运行时环境指向类 B,因此最终调用的是类 B 的 sayHello() 方法。

主要区别

  • self:::始终引用当前类中定义的方法和属性,不考虑继承。适用于需要调用类内部方法而不考虑子类重写的情况。
  • parent:::用于调用父类中定义的静态方法或属性,常用于子类扩展父类功能时调用父类的原始实现。
  • static:::引入后期静态绑定,动态绑定到运行时的派生类,适用于希望方法在继承链中动态调整行为的场景。

深入理解 self::parent::static:: 之间的区别,有助于我们编写更加健壮、易于维护的面向对象 PHP 代码,尤其是在处理复杂的继承关系时。


学习并掌握这些 PHP 关键字可以帮助你在项目开发中写出更优雅的代码。如果你想深入学习 PHP 编程,建议从静态成员的用法开始,逐步掌握面向对象编程中的关键技巧。
images

复制全文 生成海报 编程 PHP 面向对象 软件开发 技术

推荐文章

php机器学习神经网络库
2024-11-19 09:03:47 +0800 CST
php 统一接受回调的方案
2024-11-19 03:21:07 +0800 CST
开发外贸客户的推荐网站
2024-11-17 04:44:05 +0800 CST
api远程把word文件转换为pdf
2024-11-19 03:48:33 +0800 CST
四舍五入五成双
2024-11-17 05:01:29 +0800 CST
JavaScript 异步编程入门
2024-11-19 07:07:43 +0800 CST
浅谈CSRF攻击
2024-11-18 09:45:14 +0800 CST
前端代码规范 - Commit 提交规范
2024-11-18 10:18:08 +0800 CST
如何在 Vue 3 中使用 TypeScript?
2024-11-18 22:30:18 +0800 CST
Vue3中如何处理SEO优化?
2024-11-17 08:01:47 +0800 CST
你可能不知道的 18 个前端技巧
2025-06-12 13:15:26 +0800 CST
12个非常有用的JavaScript技巧
2024-11-19 05:36:14 +0800 CST
手机导航效果
2024-11-19 07:53:16 +0800 CST
windows安装sphinx3.0.3(中文检索)
2024-11-17 05:23:31 +0800 CST
Golang Sync.Once 使用与原理
2024-11-17 03:53:42 +0800 CST
使用 Git 制作升级包
2024-11-19 02:19:48 +0800 CST
用 Rust 构建一个 WebSocket 服务器
2024-11-19 10:08:22 +0800 CST
Go 单元测试
2024-11-18 19:21:56 +0800 CST
html折叠登陆表单
2024-11-18 19:51:14 +0800 CST
Vue3的虚拟DOM是如何提高性能的?
2024-11-18 22:12:20 +0800 CST
Vue3中如何处理组件的单元测试?
2024-11-18 15:00:45 +0800 CST
程序员茄子在线接单