Я использую 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, который проверяет наличие примесей, но я думаю, что это довольно дорого.