В чем же разница между is_callable и function_exists в PHP?
Я работаю над проектом, в котором я использую какую-то устаревшую функцию в старой версии. Но не хотите, чтобы мой script был остановлен, если он используется в старой версии.
Поэтому я проверяю, существует ли функция, и если она не создает ее снова.
Но в чем разница между function_exists
и is_callable
в php и какая из них лучше для пользователя?
if(!is_callable('xyz')) {
function xyz() {
// code goes here
}
}
ИЛИ
if(!function_exists('xyz')) {
function xyz() {
// code goes here
}
}
Ответы
Ответ 1
Функция is_callable
принимает не только имена функций, но и другие типы обратные вызовы:
-
Foo::method
-
array("Foo", "method")
-
array($obj, "method")
- Закрытие и другие вызываемые объекты (PHP 5.3)
Итак, is_callable
принимает все, что вы могли бы передать call_user_func
и family, а function_exists
говорит только о том, существует ли какая-то определенная функция (а не методы, см. method_exists
для этого или закрытия).
Другими словами, is_callable
является оберткой для zend_is_callable
, которая обрабатывает переменные с обратным вызовом псевдо-типа, тогда как function_exists
выполняет только поиск таблицы хешей в таблице функций.
Ответ 2
При использовании функции (а не метода класса) нет разницы, кроме того, что function_exists
выполняется немного быстрее.
Но при использовании для проверки существования методов в классе вы не можете использовать function_exists
. Вам нужно будет использовать is_callable
или method_exists
.
Ответ 3
При использовании в контексте класса is_callable
возвращает true для доступных методов класса, т.е. общедоступных методов, но method_exists
возвращает true для всех методов - public, protected и private. function_exists
делает то же самое, что и method_exists
контексты внешнего класса.
Ответ 4
Если существует функция Plop
, то function_exists("Plop")
вернет значение true.
См. function_exists
Если переменная вызываема, то is_callable($var)
вернет true.
Теперь это может означать, что $var
- это имя функции.
Но я также мог бы быть коммандой имени объекта и метода.
См. is_callable
Ответ 5
Еще одно другое:
Если у вас есть класс, который использует __call
магический метод, is_callable($object, $method)
всегда будет возвращать true для чего-либо, потому что __call
в основном принимает имя каждого метода. И как вы уже знаете, method_exists
вернет false для этого, если метод не определен в классе.
Это особенно раздражает, если вы используете класс CakePHP Model
, поскольку они реализовали магический метод __call
для предоставления магических запросов, но не здорово, если вы хотите, чтобы метод был абсолютно определен.