Как использовать is_callable с __call? - PullRequest
10 голосов
/ 09 мая 2011

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

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

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

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

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

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

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

Имею ли я какой-то смысл?

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

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

1 Ответ

4 голосов
/ 09 мая 2011

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

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

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

...