Как использовать вызывается с помощью вызова?


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

Author: Rudie, 2011-05-09

1 answers

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

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

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

 4
Author: Dr McKay, 2011-05-09 17:07:51