为何static::解析为类B时,却执行类A的foo方法?
问题解答
你的理解存在偏差,核心原因在于PHP中私有方法的作用域限制以及后期静态绑定对私有方法的特殊处理:
- 首先,
static::确实会解析为类B,但私有方法foo是在类A中定义的,它的作用域仅局限于类A内部,子类B无法直接访问该私有方法(B并没有真正继承或复制这个方法)。 - 当在A的
test方法中调用static::foo()时,由于test属于A的方法,执行时处于A的作用域内。对于私有方法的调用,PHP会直接限定在定义该方法的类(也就是A)的作用域中查找执行,不会按照继承链去B中查找(因为B没有访问这个私有方法的权限)。 - 你注释里提到的“foo()会被复制到B中”是错误的,私有方法不会被子类继承,B中不存在
foo方法的副本,这次调用能成功完全是因为执行上下文处于A的作用域内。
代码示例
class A { private function foo() { echo "success!\n"; } public function test() { $this->foo(); static::foo(); // 为何static::解析为"B"时,却执行"A"的方法? } } class B extends A { /* foo()不会被复制到B中,私有方法无法被子类继承 */ } $b = new B(); $b->test();
输出结果
success! success!
内容的提问来源于stack exchange,提问作者user19481364
相关产品推荐
相关产品推荐

