Константы в PHP: подробное руководство
Константа в PHP — это значение, которое нельзя изменить после определения. Константы играют ключевую роль в поддержании устойчивости кода.
Константа в PHP — это именованное значение, которое нельзя изменить после определения. В отличие от переменных, константы не предваряются символом $, автоматически доступны везде в скрипте (без правил области видимости), а любая попытка переприсвоить их либо игнорируется, либо вызывает ошибку. Они идеально подходят для фиксированных значений: параметров конфигурации, API-ключей, номеров версий и математических ограничений.
В этой главе рассматривается, как определять константы двумя разными способами, практические различия между ними, магические константы, константы классов и типичные ошибки, с которыми сталкиваются разработчики.
Определение константы
PHP предоставляет два инструмента: функцию define() и ключевое слово const. Оба принимают имя и значение.
<?php
// Using define()
define("SITE_NAME", "W3docs");
// Using the const keyword
const VERSION = "8.4";
echo SITE_NAME; // W3docs
echo PHP_EOL;
echo VERSION; // 8.4По соглашению имена констант пишутся в ВЕРХНЕМ РЕГИСТРЕ, однако PHP не требует этого. Допустимое имя начинается с буквы или подчёркивания, за которыми следуют буквы, цифры или подчёркивания — точно как имя переменной, только без $.
Обратите внимание, что на константу ссылаются по её голому имени (SITE_NAME), без $. Константы чувствительны к регистру: SITE_NAME и site_name — две разные константы.
const vs define()
Оба создают одинаковый вид константы, но ведут себя по-разному на уровне языка. Знание, какой инструмент выбрать, помогает избежать неочевидных ошибок:
const | define() | |
|---|---|---|
| Вычисляется | На этапе компиляции | На этапе выполнения |
Можно использовать внутри if/циклов/функций | Нет (только на верхнем уровне / в теле класса) | Да |
| Имя можно строить динамически | Нет | Да (это просто строковый аргумент) |
| Работает внутри классов | Да (определяет константу класса) | Нет |
Поскольку define() выполняется во время исполнения, это правильный выбор, когда константа должна существовать лишь при определённых условиях:
<?php
if (!defined("DEBUG")) {
define("DEBUG", true);
}
// define() can build the name dynamically — const cannot:
$key = "MAX_USERS";
define($key, 100);
echo MAX_USERS; // 100const, вычисляемый на этапе компиляции, быстрее и является общепринятым выбором для констант верхнего уровня в современном коде.
Проверка и чтение констант
Прежде чем использовать константу, существование которой неизвестно, проверьте её с помощью defined(). Чтобы получить значение константы, зная только её имя в виде строки, используйте constant():
<?php
define("TIMEOUT", 30);
if (defined("TIMEOUT")) {
echo constant("TIMEOUT"); // 30
}Константы могут хранить массивы
Начиная с PHP 7, константы не ограничены скалярными типами (int, float, string, bool) — они могут хранить и массивы. Это удобно для фиксированных таблиц поиска:
<?php
const ALLOWED_ROLES = ["admin", "editor", "viewer"];
echo ALLOWED_ROLES[1]; // editorСмотрите раздел Типы данных PHP, чтобы узнать, что может хранить каждый тип значения.
Магические константы
PHP поставляется с магическими константами — предопределёнными именами, значение которых меняется в зависимости от места использования. Они записываются с двойными подчёркиваниями в начале и в конце:
| Константа | Значение |
|---|---|
__LINE__ | Текущий номер строки |
__FILE__ | Полный путь к файлу |
__DIR__ | Директория файла |
__FUNCTION__ | Имя текущей функции |
__CLASS__ | Имя текущего класса |
__METHOD__ | Имя метода класса |
<?php
function greet() {
echo "Called from: " . __FUNCTION__ . PHP_EOL;
echo "On line: " . __LINE__ . PHP_EOL;
}
greet();Константы класса
Константы, объявленные внутри класса, принадлежат самому классу, а не его экземплярам. Объявляйте их с помощью const и обращайтесь к ним через оператор :: (оператор разрешения области видимости):
<?php
class Circle {
const PI = 3.14159;
public function area(float $r): float {
return self::PI * $r * $r;
}
}
echo Circle::PI; // 3.14159
echo PHP_EOL;
echo (new Circle)->area(2); // 12.56636Подробнее читайте в разделе Константы класса PHP.
Константы и переменные
Они служат разным целям. Переменная хранит данные, которые могут изменяться; константа фиксирует значение. Ключевые отличия:
| Переменная | Константа | |
|---|---|---|
| Префикс | $name | NAME (без знака) |
| Можно переприсвоить | Да | Нет |
| Область видимости | Локальная, если не объявлена глобальной | Глобальная автоматически |
| Чувствительность к регистру | Да | Да |
Используйте константу всякий раз, когда значение должно оставаться неизменным на протяжении всего выполнения — флаги конфигурации, ограничения, фиксированные строки — чтобы исключить случайное переопределение в другом месте кода.
Типичные ошибки
- Переопределение константы. Повторный вызов
define()с тем же именем вызывает предупреждение и сохраняет первое значение; повторное объявление черезconst— фатальная ошибка. Константы записываются один раз. - Забытый
$. Написаниеecho $SITE_NAMEищет несуществующую переменную, а не вашу константу. - Неопределённые константы. В PHP 8+ использование неопределённого bare-word константы выбрасывает
Error. Всегда определяйте константу с помощьюdefine()до использования или проверяйте черезdefined().
Заключение
Константы PHP — безопасный способ хранить значения, которые никогда не должны меняться: определяйте их с помощью const для обычных констант верхнего уровня или через define(), когда нужна логика времени выполнения или динамическое имя; группируйте фиксированные данные в массивах или константах классов; используйте встроенные магические константы для отладки. При грамотном применении они хранят конфигурацию в одном месте и предотвращают случайное переприсвоение.