可直接用父类名加作用域解析符(::)调用静态方法,无需实例化或public继承;Parent::staticMethod()最常用、语义明确;访问权限和命名空间决定是否可达。

可以直接用父类名加作用域解析符(::)调用,不需要实例化,也不依赖继承关系是否为 public。
用父类名直接调用
这是最常用、最清晰的方式。静态方法属于类本身,不依赖对象实例,所以只要父类可见,就能通过 ParentClass::staticMethod() 调用。
- 即使子类重写了同名静态方法,用父类名调用仍执行父类版本
- 无需
extends关系也能调用(只要访问权限允许) - 例如:
Database::connect();,不管当前是不是MySQLDB的子类
在子类内部调用父类静态方法
子类中想复用父类逻辑时,推荐显式使用父类名,语义明确且稳定。
- 避免用
self::,它指向当前类(可能被子类覆盖) - 慎用
static::(后期静态绑定),它会动态解析到实际调用类,不一定是父类 - 正确写法:
Parent::initConfig();,而不是self::initConfig();
注意访问控制和命名空间
能否调用取决于父类静态方法的访问修饰符和作用域。
-
public静态方法:任何地方都可调用 -
protected静态方法:仅在本类、子类或父类中可用,子类里可用Parent::method() -
private静态方法:只在定义它的类内可用,子类无法访问 - 跨命名空间需用完整限定名,如
\Vendor\Lib\Utils::formatDate()
不推荐依赖继承链自动调用
不要假设“子类能自动继承并调用父类静态方法”——静态方法不会像实例方法那样被自动继承覆盖或重定向。
- PHP 中静态调用是编译时绑定(
self)或运行时绑定(static),不是继承机制驱动 - 如果父类方法被声明为
final,子类不能重写,但依然可以用父类名正常调用 - 没有
super关键字,也没有parent::在静态上下文中的通用等价物(parent::仅在构造/析构/重写方法中有效,且不适用于任意静态调用)

















