Extension loaded: примеры (PHP)

Использование extension_loaded для проверки расширений PHP
Раздел: Расширения PHP
extension_loaded(string $extension): bool

Функция extension_loaded в PHP

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

Назначение и применение

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

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

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

  • extension_name (string) — имя расширения. Регистр символов в имени не учитывается. Например, mbstring и MBSTRING будут обработаны одинаково.

Функция возвращает булево значение: true, если указанное расширение загружено, и false в противном случае.

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

Базовая проверка расширения

Проверка загрузки популярных расширений.

if (extension_loaded('json')) {
    echo 'Расширение JSON активно.';
} else {
    echo 'Расширение JSON отсутствует.';
}
Расширение JSON активно.
Проверка с регистронезависимым именем
var_dump(extension_loaded('PDO'));
var_dump(extension_loaded('pdo'));
var_dump(extension_loaded('Pdo'));
bool(true)
bool(true)
bool(true)
Использование в условной загрузке
if (!extension_loaded('gd')) {
    die('Для работы скрипта требуется расширение GD.');
}
// Код обработки изображений

Похожие функции в PHP

function_exists

Проверяет существование конкретной функции. Более узкая проверка, чем extension_loaded.

// Проверка возможности использовать json_encode
if (function_exists('json_encode')) {
    // Вызов функции безопасен
}
phpversion

Получение версии расширения. Может использоваться для проверки наличия и версии.

if ($version = phpversion('pdo_mysql')) {
    echo "PDO MySQL $version доступен";
}

Возвращает массив всех загруженных расширений. Полезна для отладки.

$extensions = get_loaded_extensions();
if (in_array('mysqli', $extensions)) {
    echo 'mysqli загружен';
}

Выбор функции: extension_loaded — для проверки модуля в целом. function_exists — для проверки конкретной функции. get_loaded_extensions — для получения полного списка модулей.

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

Extension loaded в Python

В Python проверка наличия модуля через import в блоке try/except или с помощью importlib.util.find_spec.

try:
    import pandas
    print("Модуль pandas доступен")
except ImportError:
    print("Модуль pandas отсутствует")
Модуль pandas доступен
JavaScript (Node.js)

В Node.js проверка через require с обработкой исключений.

try {
    const module = require('fs-extra');
    console.log('Модуль fs-extra загружен');
} catch (err) {
    console.log('Модуль fs-extra не найден');
}
Модуль fs-extra загружен

Extension loaded в MySQL

Прямого аналога нет. Близкая по смыслу проверка доступности плагинов через запрос к системным таблицам.

SELECT * FROM information_schema.PLUGINS 
WHERE PLUGIN_NAME LIKE 'innodb%';

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

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

Передача пустой строки или неверного типа
var_dump(extension_loaded(''));
var_dump(extension_loaded(null));
var_dump(extension_loaded([])); // Предупреждение в PHP < 8.0, ошибка в PHP >= 8.0
bool(false)
bool(false)
TypeError: extension_loaded(): Argument #1 ($extension) must be of type string, array given
Путаница с именами расширений

Имя расширения может не совпадать с названием модуля в конфигурации.

// Проверка загрузки расширения для работы с XML
var_dump(extension_loaded('xmlwriter')); // Часто загружается как часть модуля xml
var_dump(extension_loaded('xml'));
Игнорирование контекста загрузки

Расширение может быть загружено не во всех контекстах выполнения (например, в CLI и FPM могут быть разные конфигурации).

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

PHP 8.0.0

Функция стала строго типизированной. Аргумент extension_name теперь ожидает тип string. Передача нестрокового значения вызывает TypeError.

PHP 7.0.0 и ранее

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

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

Расширенные примеры

Динамическая загрузка расширений

Проверка и попытка загрузки расширения через dl() (если разрешено).

Пример php
if (!extension_loaded('sqlite3')) {
    if (!(PHP_SHLIB_SUFFIX === 'dll' ? dl('php_sqlite3.dll') : dl('sqlite3.so'))) {
        die('Не удалось загрузить SQLite3');
    }
}
echo 'SQLite3 доступен';
Создание адаптивного кода

Выбор реализации в зависимости от доступных расширений.

Пример php
if (extension_loaded('imagick')) {
    // Использование ImageMagick
    $image = new Imagick('image.jpg');
} elseif (extension_loaded('gd')) {
    // Использование GD как fallback
    $image = imagecreatefromjpeg('image.jpg');
} else {
    die('Нет доступных библиотек для обработки изображений');
}
Проверка нескольких расширений
Пример php
$required = ['pdo_mysql', 'mbstring', 'zip'];
$missing = [];
foreach ($required as $ext) {
    if (!extension_loaded($ext)) {
        $missing[] = $ext;
    }
}
if ($missing) {
    echo 'Отсутствуют расширения: ' . implode(', ', $missing);
}
Интеграция с автозагрузкой классов

Регистрация автозагрузчика только при наличии расширения.

Пример php
if (extension_loaded('mongodb')) {
    spl_autoload_register(function($class) {
        // Автозагрузка классов MongoDB
    });
}
Логирование конфигурации сервера
Пример php
$loaded = get_loaded_extensions();
file_put_contents('extensions.log', 
    date('Y-m-d H:i:s') . ' Загружено расширений: ' . count($loaded) . "\n" .
    print_r($loaded, true)
);

PHP extension_loaded function comments

En
Extension loaded Find out whether an extension is loaded