PHP延迟静态绑定:new static 与 static:: 详解

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

延迟静态绑定允许在继承的静态上下文中引用类名,解决传统 self 引用固定为定义类的问题。通过结合 new static 创建实时实例和 static:: 动态访问属性,开发者可以轻松实现更具灵活性的多态操作。

为什么需要延迟静态绑定

在PHP中处理静态类和继承关系时,开发者常遇到一个痛点:子类重写了父类的静态方法,但父类内部的逻辑依然指向自身。传统的 self 关键字在编译时就确定了指向的类,导致子类无法获得预期的“多态”效果。

例如,若父类A中定义了一个返回类名的方法,使用 self 无论由哪个子类调用,始终返回 A。而延迟静态绑定的引入,使得在运行时能够识别真正发起调用的类,从而实现更优雅的继承结构。

核心语法对比

第一种情况:new static

new static 用于在静态方法中实例化调用该方法的当前类。

  • 目的:绕过硬编码的类名,根据调用上下文动态获取对象实例。
  • 效果:B::test() 会返回 B 类实例,而非 A 类。

第二种情况:static::$def

static:: 用于访问被调用的静态成员变量或方法。

  • 目的:获取当前子类的属性值,而不是父类的默认值。
  • 效果:B::test2() 读取的是子类 B 的 $def,而非 A 的 $def。

完整运行示例

下面是一个标准的代码结构,展示了从父类定义到子类继承后的行为差异。

<?php
class A {
 protected static $def = '123456';

 public static function test() {
  echo get_class(new static);
 }

 public static function test2() {
  echo static::$def;
 }
}

class B extends A {
 protected static $def = '456789';
}

class C extends A {
 protected static $def = 'abcdef';
}

echo B::test();
echo '<br>';
echo C::test();
echo '<br>';
echo B::test2();
echo '<br>';
echo C::test2();
echo '<br>';
echo A::test();
echo '<br>';
echo A::test2();
echo '<br>';

输出结果分析

执行上述代码后,控制台将输出以下内容:

  1. B:B 调用了 A 的方法,实例化为 B。
  2. C:C 调用了 A 的方法,实例化为 C。
  3. 456789:B 读取了自身的静态属性。
  4. abcdef:C 读取了自身的静态属性。
  5. A:A 直接调用,实例化为 A。
  6. 123456:A 读取了自身的静态属性。

以上就是PHP延迟静态绑定的详细内容,更多关于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 算法库。