Я нашел это странное поведение с классами 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 (). Ну что ж.
Спасибо за ваши ответы / комментарии.
Вы можете быть смущены тем, что означают эти вещи из контекстного метода класса:
class B extends A { public function test() { A::foo(); self::foo(); static::foo(); } }
Ни одно из них не означает «вызов статического метода с именем foo». Это просто означает «вызвать метод с именем foo» в месте в дереве наследования, как указано тем, что осталось от двоеточий.
Обычно, без магии, у вас есть только одна функция с именем foo
, поэтому смысл прост. Однако, когда вы перегружаете оба магических метода, вызов неоднозначен . PHP по умолчанию использует __call()
перед __callStatic()
.
Статические методы, переменные относятся к классам не к объектам, поэтому я думаю, что это должно работать так.