Function exists: примеры (PHP)

Использование function_exists для проверки функций в PHP
Раздел: Функции/аргументы
function_exists(string $function): bool

Основные сведения о function_exists

Назначение функции

Функция function_exists() проверяет, существует ли указанная функция в текущей среде выполнения PHP. Она определяет, была ли функция объявлена или встроена в ядро языка.

Когда используется

Функция применяется для проверки доступности функций перед их вызовом. Это полезно при работе с опциональными расширениями, для обеспечения обратной совместимости или при динамическом вызове функций, которые могут быть неопределены.

Аргументы функции

Функция принимает один обязательный параметр:

  • $function_name (string) - имя проверяемой функции в виде строки. Чувствительно к регистру, за исключением встроенных конструкций языка.

Возвращаемое значение: true, если функция с указанным именем существует, false - в противном случае.

Примеры использования function_exists

Проверка встроенной функции
<?
if (function_exists('str_replace')) {
    echo 'Функция str_replace доступна';
} else {
    echo 'Функция str_replace отсутствует';
}
?>
Функция str_replace доступна
Проверка пользовательской функции
<?
if (!function_exists('my_custom_function')) {
    function my_custom_function() {
        return 'Функция определена';
    }
}

echo my_custom_function();
?>
Функция определена
Проверка с учетом регистра
<?
// Встроенные функции нечувствительны к регистру при проверке
var_dump(function_exists('PRINT_R'));
var_dump(function_exists('Print_R'));

// Пользовательские функции чувствительны к регистру
function myFunc() {}
var_dump(function_exists('myfunc'));
var_dump(function_exists('myFunc'));
?>
bool(true)
bool(true)
bool(false)
bool(true)

Альтернативные функции в PHP

method_exists()

Проверяет существование метода в классе. Принимает объект или имя класса и имя метода. Возвращает true, если метод существует, даже если он недоступен из-за модификаторов доступа.

is_callable()

Проверяет, может ли значение быть вызвано как функция. Проверяет не только существование функции, но и корректность синтаксиса вызова. Может проверять массивы для вызова методов и замыкания.

Выбор функции

function_exists() используется для проверки именно функций. method_exists() предназначен для методов классов. is_callable() имеет более широкое применение и проверяет возможность вызова, включая проверку доступности метода.

Аналоги в других языках программирования

Function exists в Python

В Python используется функция callable() или проверка через hasattr() с модулем:

import math

# Способ 1
print(callable(math.sqrt))  # True

# Способ 2
try:
    math.sqrt
    print('Функция существует')
except AttributeError:
    print('Функция отсутствует')
True
Функция существует

Function exists в Javascript

В JavaScript проверяют тип значения или используют оператор typeof:

// Проверка встроенной функции
console.log(typeof console.log === 'function');

// Проверка пользовательской функции
function myFunc() {}
console.log(typeof myFunc === 'function');

// Проверка несуществующей функции
console.log(typeof nonExistent === 'function');
true
true
false

Function exists в MySQL

В MySQL нет прямой аналогии, но можно проверять наличие функций через системные таблицы:

SELECT name FROM mysql.proc 
WHERE db = DATABASE() AND type = 'FUNCTION';

-- Или для встроенных функций проверяем документацию

Типичные ошибки

Передача имени функции без кавычек
<?
// Неправильно - интерпретируется как константа
if (function_exists(str_replace)) {
    echo 'Проверка';
}
?>
Warning: Use of undefined constant str_replace - assumed 'str_replace'
Проверка анонимных функций
<?
$func = function() { return 'test'; };
var_dump(function_exists('$func'));
var_dump(function_exists('func'));
?>
bool(false)
bool(false)
Двойное объявление функции
<?
if (!function_exists('calculate')) {
    function calculate($a, $b) {
        return $a + $b;
    }
}

// Повторное объявление без проверки вызовет ошибку
function calculate($a, $b) {
    return $a * $b;
}
?>
Fatal error: Cannot redeclare calculate()

Изменения в версиях PHP

PHP 7.0.0

Функция стала возвращать true для встроенных языковых конструкций (echo, print, isset и др.), хотя они не являются функциями в строгом смысле. Ранее возвращалось false.

PHP 8.0.0

Улучшена обработка встроенных функций. Функция стала более последовательной в проверке различных типов встроенных конструкций.

Расширенные примеры использования

Динамический выбор реализации
Пример php
<?
// Выбор функции в зависимости от доступности расширения
if (function_exists('mb_strtolower')) {
    function strtolower_unicode($str) {
        return mb_strtolower($str, 'UTF-8');
    }
} else {
    function strtolower_unicode($str) {
        return strtolower($str);
    }
}

echo strtolower_unicode('ПРИВЕТ МИР');
?>
привет мир
Плагинная архитектура
Пример php
<?
// Загрузка функций из модулей
$modules = ['image', 'cache', 'auth'];

foreach ($modules as $module) {
    $function_name = $module . '_init';
    if (function_exists($function_name)) {
        call_user_func($function_name);
        echo "Модуль $module инициализирован\n";
    }
}

function cache_init() {
    // Инициализация кэша
}
?>
Модуль cache инициализирован
Проверка функций с пространствами имен
Пример php
<?
namespace MyProject;

function customHelper() {
    return 'Helper function';
}

// Проверка с полным именем
var_dump(function_exists('MyProject\\customHelper'));

// Проверка из глобального пространства
var_dump(function_exists('MyProject\\customHelper'));
?>
bool(true)
bool(true)
Автозагрузка функций
Пример php
<?
// Автоматическая загрузка функций при первом вызове
spl_autoload_register(function ($func_name) {
    $file = __DIR__ . '/functions/' . $func_name . '.php';
    if (file_exists($file)) {
        require_once $file;
    }
});

// При вызове несуществующей функции попытается загрузить
if (!function_exists('special_calculation')) {
    // Функция может быть загружена через autoload
    echo 'Функция не загружена';
}
?>

PHP function_exists function comments

En
Function exists Return true if the given function has been defined