PHP7.4中parent::仅限类内部静态上下文调用,编译时绑定直接父类,不支持多级如parent::parent::、外部调用或$this->parent::等写法,区别于self::(本类)和static::(运行时类)。

PHP7.4中用parent::调用父类静态方法
可以直接用parent::methodName(),但必须在子类的静态上下文中调用——比如在子类的静态方法里,或者static作用域内。如果在普通实例方法里调用,语法没问题,但语义上容易混淆(因为parent::不依赖当前实例)。
-
parent::是编译时绑定,和self::一样,不会根据运行时实际类动态改变目标 - 不能在类外部直接写
parent::foo()——parent只在类定义内部有效 - 如果父类方法是
private,即使在子类中也无法通过parent::访问
为什么不能用$this->parent::foo()或static::parent::foo()
PHP语法不支持这种写法。parent::本身就是一个作用域解析操作符,前面不能加变量或static::。常见错误是误以为可以用static::动态委托给父类,但static::parent::foo()会报Parse error: syntax error。
- 正确写法只有
parent::foo()(在子类内部) - 想实现“动态父类调用”,得靠反射或手动判断
get_parent_class()再配合call_user_func - PHP7.4不支持
ParentClass::foo()这种显式父类名调用(除非你知道确切父类名且该类可访问)
继承链中多级父类的调用限制
PHP没有内置语法让你跨多级调用祖父类的静态方法。比如A→B→C三层继承,C想调B的父类A的方法,不能写parent::parent::foo()——这会直接报错。
- 只能逐级调用:
B里用parent::foo(),C里调B的静态方法(如果B暴露了转发逻辑) - 如果A的方法是
public或protected,C也可直接写A::foo()(前提是A可见且无命名冲突) - 注意:
parent::永远只指向直接父类,和get_parent_class()返回值一致
与static::、self::的行为差异
三者在静态调用中绑定时机不同:self::和parent::是早期绑定(编译时确定),static::是后期绑定(运行时确定)。这意味着:
立即学习“PHP免费学习笔记(深入)”;
-
self::foo()总调当前类定义里的foo -
parent::foo()总调直接父类定义里的foo -
static::foo()调用时实际类重写的foo,哪怕它在子类里被覆盖
如果父类方法用了static::,而子类又重写了该方法,那么parent::调用时仍可能间接触发子类逻辑——这是容易忽略的隐式行为。



















