Extension loaded: примеры (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
Проверяет существование конкретной функции. Более узкая проверка, чем extension_loaded.
// Проверка возможности использовать json_encode
if (function_exists('json_encode')) {
// Вызов функции безопасен
}Получение версии расширения. Может использоваться для проверки наличия и версии.
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 доступен
В 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.0bool(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
Функция стала строго типизированной. Аргумент extension_name теперь ожидает тип string. Передача нестрокового значения вызывает TypeError.
Функция была менее строгой к типам аргументов. Нестроковые значения приводились к строке.
Стабильность: функция не претерпела значимых изменений в поведении, кроме усиления типизации. Она остается основным способом проверки загруженных расширений.
Расширенные примеры
Проверка и попытка загрузки расширения через dl() (если разрешено).
if (!extension_loaded('sqlite3')) {
if (!(PHP_SHLIB_SUFFIX === 'dll' ? dl('php_sqlite3.dll') : dl('sqlite3.so'))) {
die('Не удалось загрузить SQLite3');
}
}
echo 'SQLite3 доступен';Выбор реализации в зависимости от доступных расширений.
if (extension_loaded('imagick')) {
// Использование ImageMagick
$image = new Imagick('image.jpg');
} elseif (extension_loaded('gd')) {
// Использование GD как fallback
$image = imagecreatefromjpeg('image.jpg');
} else {
die('Нет доступных библиотек для обработки изображений');
}$required = ['pdo_mysql', 'mbstring', 'zip'];
$missing = [];
foreach ($required as $ext) {
if (!extension_loaded($ext)) {
$missing[] = $ext;
}
}
if ($missing) {
echo 'Отсутствуют расширения: ' . implode(', ', $missing);
}Регистрация автозагрузчика только при наличии расширения.
if (extension_loaded('mongodb')) {
spl_autoload_register(function($class) {
// Автозагрузка классов MongoDB
});
}$loaded = get_loaded_extensions();
file_put_contents('extensions.log',
date('Y-m-d H:i:s') . ' Загружено расширений: ' . count($loaded) . "\n" .
print_r($loaded, true)
);