Подтвердить что ты не робот

В чем же разница между 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
  }
}
4b9b3361

Ответ 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 для предоставления магических запросов, но не здорово, если вы хотите, чтобы метод был абсолютно определен.