define()
Как PHP define() создаёт константы, чем отличается от const, какие значения принимает и о чём нужно знать.
Что делает функция define()
Функция define() создаёт константу — именованное значение, которое нельзя изменить после задания. В отличие от переменной, константа не имеет префикса $, является глобальной для всего скрипта (в том числе внутри функций), а попытка переопределить её вызывает предупреждение вместо того, чтобы молча перезаписать значение.
Используйте define(), когда нужен единственный источник истины для значения, которое никогда не должно меняться в процессе выполнения: флаг конфигурации, номер версии, путь к файлу или конечная точка API.
Синтаксис
define(string $name, mixed $value, bool $case_insensitive = false): bool$name— имя константы. По соглашению используются прописные буквы с подчёркиванием (MAX_USERS), но подойдёт любой допустимый идентификатор.$value— сохраняемое значение. Скалярные типы (int,float,string,bool) иnullподдерживались всегда; array стал допустимым значением в PHP 7.0.$case_insensitive(необязательный) — исторически передачаtrueпозволяла обращаться к константе в любом регистре. Этот флаг устарел начиная с PHP 7.3 и удалён в PHP 8.0, поэтому его следует опускать, а имена констант считать чувствительными к регистру.
define() возвращает true при успехе и false при ошибке.
Базовый пример
Здесь define() создаёт константу с именем GREETING, хранящую Hello, world!, а затем echo выводит её по имени — без $ и без кавычек.
Хранение array в константе
Начиная с PHP 7.0 константа может хранить array, что удобно для фиксированных таблиц поиска или списков параметров:
<?php
define("ROLES", ["admin", "editor", "viewer"]);
echo ROLES[1]; // editor
?>Проверка перед использованием константы
Обращение к неопределённой константе является ошибкой в PHP 8.0+. Используйте defined() в качестве защиты, чтобы код корректно завершался при её отсутствии:
<?php
if (!defined("APP_ENV")) {
define("APP_ENV", "production");
}
echo APP_ENV; // production
?>define() и const
PHP предоставляет два способа объявления константы, и они не взаимозаменяемы:
| Возможность | define() | const |
|---|---|---|
| Момент выполнения | Во время выполнения | Во время компиляции |
| Условное использование / в цикле | Да — можно размещать внутри if/for | Нет — должна быть на верхнем уровне или в классе |
| Динамическое имя | Да — имя может быть переменной | Нет — имя фиксировано |
| Константы класса | Нет | Да |
Выбирайте define(), когда имя или значение вычисляется, либо когда объявление должно быть условным. Используйте const для простых, всегда объявляемых констант и констант класса.
Типичные ошибки
- Без
$и без кавычек при чтении. Пишитеecho GREETING;, а неecho $GREETING;илиecho "GREETING";. - Переопределение вызывает предупреждение, но не перезаписывает. Повторный вызов
define("GREETING", ...)выдаёт предупреждение, а исходное значение сохраняется. - Имена чувствительны к регистру.
GREETINGиGreeting— две разные константы с тех пор, как флаг нечувствительности к регистру был удалён. - Объявляйте один раз, в начале. Поскольку константы глобальны и постоянны, задавайте их в начале скрипта или в файле конфигурации.
Заключение
define() — это способ создать глобальное неизменяемое значение в PHP во время выполнения. Используйте его вместе с defined(), чтобы избежать предупреждений о переопределении, предпочитайте const для фиксированных констант времени компиляции и констант класса, а общую картину смотрите в разделе PHP Constants.