为什么相对静态调用没有实现扩展class的命名空间?

Why relative static call not implement namespace of extended class?

为什么只静态调用return2?

在我看来,class 不是绝对名称的调用应该取决于 class

中的当前名称空间
<?php
namespace A {
    class B {
        static function test(){
            echo 1;
        }
        static function check(){
            B::test();//1 why?
            self::test();//1
            static::test();//2
        }
    }
}
namespace B {
    class B extends \A\B {
        static function test(){
            echo 2;
        }
    }
}
namespace {
    B\B::check();
}

B::test()A 命名空间内执行,因此采用由 A 命名空间提供的 B class。因此 A\B::test 被调用。当前 class 的上下文与此无关。

以下示例表明,遗传与此行为无关。

<?php
namespace A {
    class B {
        static function test() {
             echo 3;
        }
    }
    class A {
        static function test(){
            echo 1;
        }
        static function check(){
            B::test();//3
            self::test();//1
            static::test();//2
        }
    }
}
namespace B {
    class B extends \A\A {
        static function test(){
            echo 2;
        }
    }
}
namespace {
    B\B::check();
}

static::test returns 2 即使您在 A 命名空间中,因为 static 从调用超级 class 获取上下文而不是当前命名空间。

self::testreturns1,因为self取当前class的上下文,而不是超class.