Странное поведение при запуске __callStatic () из нестатического метода

Я нашел это странное поведение с классами PHP (v5.3.8).

У тебя есть:

class foo { function __call($func, $args) { if ($func == 'bar') echo "non-static __call"; } static function __callStatic($func, $args) { if ($func == 'bar') echo "__callStatic"; } function callMe() { self::bar(); } } 

Затем вы выполните:

 foo::bar() // outputs '__callStatic' as expected. $f = new foo; $f->callMe(); // outputs 'non-static __call', as I did not expect. 

Видите ли, несуществующий статический метод, вызываемый из нестатической функции, запускает __call() вместо __callStatic() . Мне было интересно, должно ли это работать так, или это какая-то ошибка?

[РЕДАКТИРОВАТЬ]

Я забыл попробовать static::bar(); на callMe() но нет, это тоже не сработало.

Я (думаю, я) понимаю комментарий пользователя, но все же … если я вызываю сам класс, а не экземпляр или объект, немедленная логика для меня говорит, что он должен вызывать __callStatic (). Ну что ж.

Спасибо за ваши ответы / комментарии.

Solutions Collecting From Web of "Странное поведение при запуске __callStatic () из нестатического метода"

Вы можете быть смущены тем, что означают эти вещи из контекстного метода класса:

 class B extends A { public function test() { A::foo(); self::foo(); static::foo(); } } 

Ни одно из них не означает «вызов статического метода с именем foo». Это просто означает «вызвать метод с именем foo» в месте в дереве наследования, как указано тем, что осталось от двоеточий.

Обычно, без магии, у вас есть только одна функция с именем foo , поэтому смысл прост. Однако, когда вы перегружаете оба магических метода, вызов неоднозначен . PHP по умолчанию использует __call() перед __callStatic() .

Статические методы, переменные относятся к классам не к объектам, поэтому я думаю, что это должно работать так.