Почему относительный статический вызов не реализует пространство имен расширенного класса?

Почему только статический вызов 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

Решение

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 принимает контекст текущего класса вместо суперкласса.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector