W3docs

Константы в 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()

Оба создают одинаковый вид константы, но ведут себя по-разному на уровне языка. Знание, какой инструмент выбрать, помогает избежать неочевидных ошибок:

constdefine()
ВычисляетсяНа этапе компиляцииНа этапе выполнения
Можно использовать внутри 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; // 100

const, вычисляемый на этапе компиляции, быстрее и является общепринятым выбором для констант верхнего уровня в современном коде.

Проверка и чтение констант

Прежде чем использовать константу, существование которой неизвестно, проверьте её с помощью 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.

Константы и переменные

Они служат разным целям. Переменная хранит данные, которые могут изменяться; константа фиксирует значение. Ключевые отличия:

ПеременнаяКонстанта
Префикс$nameNAME (без знака)
Можно переприсвоитьДаНет
Область видимостиЛокальная, если не объявлена глобальнойГлобальная автоматически
Чувствительность к региструДаДа

Используйте константу всякий раз, когда значение должно оставаться неизменным на протяжении всего выполнения — флаги конфигурации, ограничения, фиксированные строки — чтобы исключить случайное переопределение в другом месте кода.

Типичные ошибки

  • Переопределение константы. Повторный вызов define() с тем же именем вызывает предупреждение и сохраняет первое значение; повторное объявление через const — фатальная ошибка. Константы записываются один раз.
  • Забытый $. Написание echo $SITE_NAME ищет несуществующую переменную, а не вашу константу.
  • Неопределённые константы. В PHP 8+ использование неопределённого bare-word константы выбрасывает Error. Всегда определяйте константу с помощью define() до использования или проверяйте через defined().

Заключение

Константы PHP — безопасный способ хранить значения, которые никогда не должны меняться: определяйте их с помощью const для обычных констант верхнего уровня или через define(), когда нужна логика времени выполнения или динамическое имя; группируйте фиксированные данные в массивах или константах классов; используйте встроенные магические константы для отладки. При грамотном применении они хранят конфигурацию в одном месте и предотвращают случайное переприсвоение.

Практика

Практика
Каковы характеристики констант PHP?
Каковы характеристики констант PHP?
Was this page helpful?