Я работаю над проектом, в котором я использую устаревшую функцию из более старой версии. Но не хочу, чтобы мой скрипт был остановлен, если он использовался в старой версии. Поэтому я проверяю, существует ли функция и не создает ли ее снова.
Но в чем разница между function_exists
и is_callable
в php и какая из них лучше пользователю?
if(!is_callable('xyz')) {
function xyz() {
// code goes here
}
}
ИЛИ
if(!function_exists('xyz')) {
function xyz() {
// code goes here
}
}
Функция is_callable
принимает не только имена функций, но и другие типы обратных вызовов:
Foo::method
array("Foo", "method")
array($obj, "method")
Итак, is_callable
принимает все, что вы могли бы передать call_user_func
и семейство, а function_exists
только говорит, существует ли определенная функция (не методы, об этом см. method_exists
и не закрытия).
Говоря иначе, is_callable
является оберткой для zend_is_callable
, который работает с переменными с псевдо-типом callback, в то время как function_exists
только выполняет поиск по хэш-таблице в таблице функций.
При использовании с функцией (не методом класса) нет никакой разницы, за исключением того, что function_exists
работает немного быстрее.
Но при использовании для проверки существования методов в классе вы не можете использовать function_exists
. Вам нужно будет использовать is_callable
или method_exists
.
Если функция Plop
существует, то function_exists("Plop")
вернет true.
См. function_exists
Если переменная является вызываемой, то is_callable($var)
вернет true.
Теперь это может означать, что $var
- это имя функции.
Но я также могу быть именем объекта и метода.
См. is_callable