Get defined constants: примеры (PHP)
get_defined_constants(bool $categorize = false): arrayФункция get_defined_constants() возвращает ассоциативный массив с именами и значениями всех определенных на данный момент констант.
Функция часто используется для отладки, логирования, создания документации или динамической проверки существования и значений констант в системе. Она позволяет получить как пользовательские константы, определенные через define(), так и все предопределенные константы PHP (магические константы, константы расширений, константы стандартной библиотеки).
Функция имеет один необязательный параметр:
- $categorize (bool) - если установлено в
true, функция возвращает многомерный массив, где константы сгруппированы по категориям (расширениям, в которых они определены). Константы ядра PHP попадают в категориюCore, а пользовательские - вuser. По умолчаниюfalse.
<?
define('MY_CONST', 'Значение');
$allConstants = get_defined_constants();
echo 'Всего констант: ' . count($allConstants) . '\n';
// Вывод конкретной константы
if (isset($allConstants['MY_CONST'])) {
echo 'MY_CONST = ' . $allConstants['MY_CONST'];
}
?>Всего констант: 1694 MY_CONST = Значение
<?
define('APP_NAME', 'MyApp');
$categorized = get_defined_constants(true);
// Посмотрим на структуру
print_r(array_keys($categorized));
?>Array
(
[0] => Core
[1] => pcre
[2] => ... // другие расширения
[10] => user
)Прямых аналогов для получения всех констант нет, но существуют функции для работы с константами в отдельных контекстах:
- defined($name) - проверяет, определена ли константа с заданным именем. Используется для условного определения констант.
- constant($name) - возвращает значение константы по ее имени, переданному в виде строки. Полезно при динамическом выборе имени константы.
- Для получения констант класса используется get_class_constants().
Функцию get_defined_constants() предпочтительнее использовать, когда нужен полный обзор или фильтрация констант. defined() и constant() применяются для точечной работы с известными именами.
Get defined constants в Python
В Python нет встроенной функции для получения всех констант модуля, так как концепция констант не является строгой. Обычно все переменные, объявленные в верхнем регистре, считаются константами. Для интроспекции можно использовать dir(module) или vars(module).
import sys
# Получение всех имен в модуле sys, начинающихся с большой буквы
constants = [name for name in dir(sys) if name.isupper()]
print(constants[:5]) # первые 5['api_version', 'copyright', 'dllhandle', 'executable', 'flags']
В JavaScript (Node.js) нет отдельной функции для констант. Можно использовать Object.keys(global) для получения глобальных переменных, но это включает и функции, и объекты.
// В среде Node.js
const globalKeys = Object.keys(global);
console.log(globalKeys.filter(key => key === key.toUpperCase()).slice(0,5));[ 'global', 'GCProfiler', 'Math', 'JSON', 'NaN' ]
Get defined constants в MySQL
В SQL нет прямого аналога. Ближайшая концепция - системные переменные, которые можно получить запросом SHOW VARIABLES; или SELECT @@version;.
Массив, возвращаемый функцией, является снимком состояния на момент вызова. Новые константы, определенные после вызова, в него не попадут.
<?
$constantsBefore = get_defined_constants();
define('NEW_CONST', 123);
// NEW_CONST не будет в $constantsBefore
var_dump(isset($constantsBefore['NEW_CONST']));
?>bool(false)
При использовании флага categorize доступ к константе осуществляется через вложенный массив.
<?
define('MY_CONST', 'test');
$cat = get_defined_constants(true);
// Неправильно:
// echo $cat['MY_CONST'];
// Правильно:
echo $cat['user']['MY_CONST'];
?>test
- В PHP 8.0.0 порядок сортировки констант в возвращаемом массиве теперь зависит от порядка регистрации констант в расширениях. Ранее константы могли возвращаться в алфавитном порядке.
- В PHP 7.1.0 константы класса теперь также включаются в возвращаемый массив, когда функция вызывается внутри области видимости класса.
<?
// Получить все константы, имена которых начинаются с 'E_' (константы ошибок)
$all = get_defined_constants();
$errorConstants = array_filter($all, fn($value, $key) => str_starts_with($key, 'E_'), ARRAY_FILTER_USE_BOTH);
print_r(array_keys($errorConstants));
?>Array
(
[0] => E_ERROR
[1] => E_WARNING
[2] => E_PARSE
// ...
)<?
$before = get_defined_constants();
// Предположим, что расширение не загружено
$after = get_defined_constants();
// Находим новые константы
$newConstants = array_diff_key($after, $before);
if (empty($newConstants)) {
echo 'Новых констант не добавлено';
}
?><?
$all = get_defined_constants();
// Найти все константы со значением true
$trueConstants = [];
foreach ($all as $name => $value) {
if ($value === true) {
$trueConstants[] = $name;
}
}
print_r(array_slice($trueConstants, 0, 5));
?>Array
(
[0] => true
[1] => MYSQLI_ASSOC
[2] => MYSQLI_NUM
// ...
)<?
$categorized = get_defined_constants(true);
foreach ($categorized as $category => $constants) {
echo "Расширение/Категория: $category, Констант: " . count($constants) . "\n";
}
?>