You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 12:10:17