Menu

Константы PHP: define() и const, магические константы

Константа PHP это имя для значения, которое нельзя изменить: const MAX_USERS = 100; или define('MAX_USERS', 100);. Разница define и const, константы-массивы, константы класса через self::, проверка через defined() и магические константы __LINE__, __FILE__, __DIR__ и __CLASS__.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Константа это имя для значения, которое не меняется, пока работает скрипт. Объявите её через const MAX_USERS = 100; или define('MAX_USERS', 100); и используйте просто имя, без $.

По соглашению имена констант пишут в UPPER_SNAKE_CASE. Константы глобальны: константа, объявленная в начале файла, видна в каждой функции без global.

define() и const

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

constdefine()
Внутри if, циклов, функцийНетДа
Имя собирается из переменнойНетДа
Константы классаДаНет
Значение может быть выражениемДа, из констант и литераловДа, любое значение
Автоматически попадает в пространство имёнДаНет (указывайте полное имя)

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

Константы нельзя изменить

Присваивание константе это ошибка разбора:

<?php
const LIMIT = 10;
LIMIT = 20;
PHP Parse error:  syntax error, unexpected token "=" in /home/index.php on line 3

Повторное определение той же константы не ошибка, но PHP печатает предупреждение и оставляет первое значение:

<?php
define("LIMIT", 10);
define("LIMIT", 20);
echo LIMIT; // 10
Warning: Constant LIMIT already defined in /home/index.php on line 3

Если значение может быть уже задано (например, в файле настроек, который подключается больше одного раза), сначала проверьте через defined():

Константы-массивы

Константа может хранить массив. Его можно читать через NAME[key], обходить в цикле и передавать дальше, но не изменять.

Константы класса

Внутри класса const объявляет константу, которая принадлежит классу. Снаружи она читается как ClassName::NAME, а изнутри как self::NAME или static::NAME. У констант класса может быть область видимости, они могут быть final, а начиная с PHP 8.3 могут объявлять тип.

Группу связанных констант класса вроде STATUS_NEW и STATUS_PAID часто лучше записать как enum: он к тому же не даёт передавать недопустимые значения.

Магические константы: LINE, FILE, DIR и другие

Значение магических констант зависит от того, где они стоят. Оно подставляется при компиляции.

Чаще всего используют __DIR__, каталог текущего файла. Пути для подключения, собранные от него, работают независимо от того, из какого каталога запущен скрипт: require __DIR__ . '/config.php';. Полный шаблон смотрите в include и require.

Встроенные константы, которые стоит знать

В PHP много собственных констант. Эти встречаются постоянно:

PHP_EOL это окончание строки той системы, на которой работает PHP ("\n" в Linux и macOS, "\r\n" в Windows). Он предназначен для текста, который пишется в файлы и терминал; в HTML-выводе перенос строки не виден, поэтому там используйте <br>.

Часто задаваемые вопросы

Чем define() отличается от const в PHP?

const это языковая конструкция, которая разрешается при компиляции файла: она работает на верхнем уровне и внутри классов, но не внутри if, циклов или функций. define() это функция, вызываемая во время выполнения, поэтому работает где угодно, и имя можно собрать из переменной, но константы класса через неё объявить нельзя.

Может ли константа PHP быть массивом?

Да. Работают и const COLORS = ['red', 'green'];, и define('COLORS', ['red', 'green']);, а элемент читается как COLORS[0]. Изменить массив после этого нельзя.

Как проверить, определена ли константа в PHP?

Используйте defined('NAME'): функция принимает имя строкой и возвращает true или false. Частый шаблон: if (!defined('APP_ENV')) { define('APP_ENV', 'production'); }. Для констант класса передавайте 'ClassName::NAME'.

Что такое магические константы в PHP?

Константы, значение которых зависит от места, где они написаны: __LINE__ (текущая строка), __FILE__ (полный путь к файлу), __DIR__ (его каталог), __FUNCTION__, __CLASS__, __METHOD__ и __NAMESPACE__. Они пишутся с двумя подчёркиваниями с каждой стороны и не чувствительны к регистру.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ