Как использовать is_callable с __вызовом?

#php #call #overloading #overriding #magic-methods

#php #вызов #перегрузка #переопределение #magic-методы

Вопрос:

Я использую PHP 5.3, который вводит замыкания. Поскольку теперь у меня есть замыкания, доступные во всем моем приложении (и фреймворке), я использую is_callable, чтобы увидеть, что это за обработчик $callback .

Если $callback is_callable , я знаю достаточно и использую эту функцию / метод / закрытие. Если это не вызываемое значение и это строка, то, вероятно, это имя метода в $this классе. Он может существовать, а может и нет. Если я позволю ему перейти на PHP, он «выдаст» приятную фатальную ошибку (мне такие нравятся).

Но я хочу использовать дополнения, что означает, что мне нужен волшебный метод __call . __call это очень здорово, потому что оно (может) содержать (ы) логику перед фактическим вызовом функции. НО … что произойдет, если после __call вызываемый метод не существует? Конечно, я могу выдать исключение, но мы не узнаем об этом до тех пор, пока.

Теперь проблема заключается в полезности is_callable , потому что после реализации __call все вернет true, потому что у всего есть запасной вариант (бытие __call ).

Есть ли способ использовать оба: динамические методы и полезные is_callable ?

Что бы я хотел увидеть, так это какой-нибудь магический метод кэширования, __is_callable с которым PHP будет «консультироваться» при is_callable(array($object, $method)) вызове.

На php.net Я не могу найти никого, кто так же расстроен этим, как я. Этого не может быть! Если вы используете __call , вы больше не сможете использовать is_callable !?

Есть ли во мне какой-то смысл?

PS. Я изучил method_exists , но этого просто недостаточно (даже если я смогу отфильтровать все замыкания и глобальные функции), потому что это вернет true как для частных, так и для защищенных методов, а также для общедоступных.

Редактировать
Я создал «лучший» is_callable, который проверяет наличие подстановок, но я думаю, что это довольно дорого.

Ответ №1:

Первая идея: как насчет проверки, существует ли метод в get_class_methods() ? Эта функция решает проблемы с областью видимости.

Вторая идея: если функция, которую вы ищете, не существует в классе, вы также можете проверить (с помощью method_exists ), содержит ли класс __call магический метод, если это не так, то, очевидно, вызов несуществующей функции является незаконным. Если класс содержит __call метод, вполне вероятно, что вызывающий объект знает, что он делает.

Это всего лишь мои мысли, я предполагаю, что Python лучше в такого рода вещах.

Комментарии:

1. get_class_methods решил другую проблему, но на самом деле не из-за ошибок. Эта очень важная часть на самом деле не соответствует действительности: «Если класс содержит __call метод, вполне вероятно, что вызывающий объект знает, что он делает». потому что вы могли бы установить средство визуализации для 10 классов, которое есть (и используется) только у 4 классов, а остальные 6 будут использовать стандарт, но теперь вам нужно установить его только один раз. (Вау, ты понял это?)