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

时间:2018-01-03 13:13:44

标签: php namespaces extends

为什么只有静态调用返回2?

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

中的当前名称空间
<?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();
}

1 个答案:

答案 0 :(得分:0)

B::test()A命名空间内执行,因此获取B命名空间提供的A类。因此调用A\B::test。当前班级的背景与此无关。

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

<?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命名空间时,

2会返回A,因为static从调用超类而不是当前命名空间获取上下文。

self::test返回1,因为self获取当前类的上下文而不是超类。