Get defined constants: примеры (PHP)

Использование get_defined_constants для получения всех констант PHP
Раздел: Работа с константами
get_defined_constants(bool $categorize = false): array

Функция get_defined_constants() возвращает ассоциативный массив с именами и значениями всех определенных на данный момент констант.

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

Функция часто используется для отладки, логирования, создания документации или динамической проверки существования и значений констант в системе. Она позволяет получить как пользовательские константы, определенные через define(), так и все предопределенные константы PHP (магические константы, константы расширений, константы стандартной библиотеки).

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

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

  • $categorize (bool) - если установлено в true, функция возвращает многомерный массив, где константы сгруппированы по категориям (расширениям, в которых они определены). Константы ядра PHP попадают в категорию Core, а пользовательские - в user. По умолчанию false.
Базовые примеры использования
Пример 1: Получение списка всех констант
<?
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 = Значение
Пример 2: Использование флага categorize
<?
define('APP_NAME', 'MyApp');
$categorized = get_defined_constants(true);
// Посмотрим на структуру
print_r(array_keys($categorized));
?>
Array
(
    [0] => Core
    [1] => pcre
    [2] => ... // другие расширения
    [10] => user
)
Похожие функции в PHP

Прямых аналогов для получения всех констант нет, но существуют функции для работы с константами в отдельных контекстах:

  • 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)

В 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;.

Типичные ошибки
1. Ожидание обновления массива динамически

Массив, возвращаемый функцией, является снимком состояния на момент вызова. Новые константы, определенные после вызова, в него не попадут.

<?
$constantsBefore = get_defined_constants();
define('NEW_CONST', 123);
// NEW_CONST не будет в $constantsBefore
var_dump(isset($constantsBefore['NEW_CONST']));
?>
bool(false)
2. Непонимание структуры при categorize = true

При использовании флага categorize доступ к константе осуществляется через вложенный массив.

<?
define('MY_CONST', 'test');
$cat = get_defined_constants(true);
// Неправильно:
// echo $cat['MY_CONST'];
// Правильно:
echo $cat['user']['MY_CONST'];
?>
test
Изменения в версиях PHP
  • В PHP 8.0.0 порядок сортировки констант в возвращаемом массиве теперь зависит от порядка регистрации констант в расширениях. Ранее константы могли возвращаться в алфавитном порядке.
  • В PHP 7.1.0 константы класса теперь также включаются в возвращаемый массив, когда функция вызывается внутри области видимости класса.
Расширенные примеры
Пример 1: Фильтрация констант по префиксу
Пример php
<?
// Получить все константы, имена которых начинаются с '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
    // ...
)
Пример 2: Сравнение констант до и после загрузки модуля
Пример php
<?
$before = get_defined_constants();
// Предположим, что расширение не загружено
$after = get_defined_constants();
// Находим новые константы
$newConstants = array_diff_key($after, $before);
if (empty($newConstants)) {
    echo 'Новых констант не добавлено';
}
?>
Пример 3: Поиск константы по значению
Пример php
<?
$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
    // ...
)
Пример 4: Использование с categorize для анализа расширений
Пример php
<?
$categorized = get_defined_constants(true);
foreach ($categorized as $category => $constants) {
    echo "Расширение/Категория: $category, Констант: " . count($constants) . "\n";
}
?>

PHP get_defined_constants function comments

En
Get defined constants Returns an associative array with the names of all the constants and their values