Constant: примеры (PHP)
constant(string $name): mixedФункция constant в PHP
Функция constant() в языке PHP предназначена для получения значения константы по её имени, переданному в виде строки. Этот механизм полезен в ситуациях, когда имя константы формируется динамически во время выполнения скрипта.
- Когда имя константы хранится в переменной или получается в результате работы другого кода.
- Для повышения гибкости кода, где обращение к константам зависит от условий.
- При работе с константами, чьи имена генерируются автоматически.
Функция принимает один обязательный параметр:
- $name (string) – строка, содержащая имя константы. Чувствительна к регистру.
Функция возвращает значение константы. Если константа с указанным именем не определена, генерируется ошибка уровня E_WARNING и возвращается null (начиная с PHP 8.0.0, в более ранних версиях могло генерироваться E_NOTICE).
Базовые примеры использования
<?php
define('SITE_NAME', 'MyWebsite');
$constantName = 'SITE_NAME';
echo constant($constantName);
?>MyWebsite
<?php
$result = constant('UNDEFINED_CONST');
var_dump($result);
?>Warning: constant(): Couldn't find constant UNDEFINED_CONST in ... NULL
<?php
class MyClass {
public const STATUS = 'active';
}
$const = 'MyClass::STATUS';
echo constant($const);
?>active
Похожие функции в PHP
Константу можно получить напрямую, если её имя известно на этапе написания кода.
<?php
define('VERSION', '8.0');
echo VERSION; // Проще и быстрее, чем constant('VERSION')
?>Проверяет, определена ли константа, но не возвращает её значение. Часто используется в паре с constant().
<?php
if (defined('DEBUG_MODE')) {
$mode = constant('DEBUG_MODE');
}
?>Это предопределённые константы, которые меняют значение в зависимости от контекста. Их нельзя получить через constant().
Когда что использовать: Прямое обращение – когда имя константы известно. constant() – для динамического имени. defined() – для проверки существования.
Аналоги в других языках
Constant в Python
В Python нет отдельной функции. Константы – это просто переменные, а для динамического доступа используют globals() или getattr() для атрибутов модуля/класса.
import sys
# Аналог через глобальную область видимости
MY_CONST = 100
name = 'MY_CONST'
print(globals().get(name))100
Constant в Javascript
В JS константы объявляются через const. Для динамического достава к глобальным константам можно использовать window (в браузере) или globalThis.
// В глобальной области видимости (браузер)
const MAX_SIZE = 1024;
let constName = 'MAX_SIZE';
console.log(window[constName]); // Работает для var, но не для const/let
// Более надежный способ - использовать объект для хранения констант.
const CONSTANTS = { MAX_SIZE: 1024 };
console.log(CONSTANTS[constName]);1024
Constant в MySQL
В MySQL есть системные переменные (например, @@version), но нет точного аналога. Динамический SQL (подготовленные выражения) позволяет подставлять имена объектов.
-- Нет прямого аналога constant().
-- Имена переменных должны быть известны на этапе написания запроса.
SET @my_var = 10;
SELECT @my_var;Типичные ошибки
Вызов функции для несуществующей константы вызывает предупреждение.
<?php
// Неправильно: нет проверки
$value = constant('USER_ROLE'); // Warning, если константа не определена
// Правильно: предварительная проверка
if (defined('USER_ROLE')) {
$value = constant('USER_ROLE');
} else {
$value = 'default';
}
?><?php
define('PATH', '/tmp');
echo constant('path'); // Не найдено, регистр имеет значение
?>Warning: constant(): Couldn't find constant path in ... NULL
<?php
// До PHP 8
$arr = ['MY_CONST'];
echo constant($arr[0]); // Работало, так как stringable
// В PHP 8+ тип аргумента строго string
$num = 123;
echo constant($num); // TypeError
?>Изменения в PHP 8
В PHP 8.0 параметр $name функции constant() имеет тип string. Передача значения другого типа вызывает TypeError. Ранее нестроковые значения преобразовывались в строку.
<?php
// PHP 7
$obj = new class { public function __toString() { return 'TEST'; }};
echo constant($obj); // Работало, если был метод __toString
// PHP 8
// constant($obj); // TypeError: constant(): Argument #1 ($name) must be of type string
?>В PHP 8.0.0 ошибка при поиске несуществующей константы изменилась с E_NOTICE на E_WARNING.
Расширенные примеры
<?php
define('COLOR_RED', '#FF0000');
define('COLOR_GREEN', '#00FF00');
define('COLOR_BLUE', '#0000FF');
function getThemeColor($theme) {
$constName = 'COLOR_' . strtoupper($theme);
return defined($constName) ? constant($constName) : '#FFFFFF';
}
echo getThemeColor('red') . "\n";
echo getThemeColor('unknown');
?>#FF0000 #FFFFFF
<?php
namespace MyProject\Settings {
define('MyProject\Settings\MAX_LOG', 100);
}
namespace {
$fullConstName = 'MyProject\Settings\MAX_LOG';
echo constant($fullConstName);
}
?>100
<?php
class Logger {
public const LEVEL_ERROR = 1;
public const LEVEL_WARNING = 2;
public const LEVEL_INFO = 3;
}
function logMessage($message, $levelType) {
$constName = 'Logger::LEVEL_' . strtoupper($levelType);
$level = constant($constName);
if ($level === null) {
$level = Logger::LEVEL_INFO;
}
echo "Уровень $level: $message\n";
}
logMessage('Системная ошибка', 'ERROR');
logMessage('Неизвестный тип', 'DEBUG');
?>Уровень 1: Системная ошибка Уровень 3: Неизвестный тип
<?php
// Если constant() вызывается часто в цикле с одним именем
$configCache = [];
function getConfigConst($name) {
global $configCache;
if (!array_key_exists($name, $configCache)) {
$configCache[$name] = defined($name) ? constant($name) : null;
}
return $configCache[$name];
}
// Пример использования
for ($i = 0; $i < 10000; $i++) {
$val = getConfigConst('SOME_HEAVY_CONST'); // Вызов defined/constant один раз
}
?>