Как использовать is_callable с __call?

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

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

Но я хочу использовать mix-ins, что означает, что мне нужен волшебный метод __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 будет лучше в таких вещах.