Почему только статический вызов 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();
}
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
принимает контекст текущего класса вместо суперкласса.
Других решений пока нет …