#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 будут использовать стандарт, но теперь вам нужно установить его только один раз. (Вау, ты понял это?)