const
Узнайте, как использовать ключевое слово const в PHP для объявления глобальных и классовых констант, чем оно отличается от define().
Ключевое слово PHP const
Константа — это именованное значение, которое не может изменяться во время выполнения скрипта. Ключевое слово const — один из двух способов объявить константу в PHP (второй — функция define()). В отличие от переменной, перед именем константы нет знака $, и после её объявления нельзя ни переприсвоить значение, ни вызвать unset().
Это руководство охватывает, что делает const, чем оно отличается от define(), где его можно использовать, и распространённые ошибки, на которых спотыкаются разработчики.
Синтаксис
Вы можете использовать const на верхнем уровне скрипта (глобальная константа) или внутри класса, интерфейса или трейта (константа класса):
const NAME = value; // global constantclass ClassName {
const NAME = value; // class constant, accessed as ClassName::NAME
}По соглашению имена констант пишутся в формате UPPER_SNAKE_CASE. Имя должно начинаться с буквы или символа подчёркивания и содержать только буквы, цифры и символы подчёркивания.
const и define()
PHP предоставляет два инструмента, похожих внешне, но ведущих себя по-разному. Понимание их отличий сэкономит время при отладке:
| Характеристика | const | define() |
|---|---|---|
| Вычисляется | В момент компиляции | В момент выполнения |
Может выполняться условно (внутри if) | Нет | Да |
| Работает внутри класса | Да (константа класса) | Нет |
| Имя из переменной/выражения | Нет | Да (define($name, ...)) |
| Значение | Только константные выражения | Любое выражение |
Практическое правило: используйте const для фиксированных, всегда определённых значений (особенно констант класса), а define() — когда имя или значение определяется в процессе выполнения программы.
<?php
// define() can be conditional; const cannot.
if (!defined('ENVIRONMENT')) {
define('ENVIRONMENT', 'production');
}
// This would be a fatal parse error — const cannot live inside an if-block:
// if (true) { const FOO = 1; }Подробнее см. в отдельной главе define() и в обзоре констант PHP.
Примеры
Константа класса и глобальная константа
<?php
// Example 1 — a class constant referenced with self::
class Circle
{
const PI = 3.14;
public $radius;
public function __construct($radius)
{
$this->radius = $radius;
}
public function getArea()
{
return self::PI * $this->radius * $this->radius;
}
}
$myCircle = new Circle(5);
echo "Area of circle: " . $myCircle->getArea() . PHP_EOL;
// Output: Area of circle: 78.5
// Example 2 — a global constant
const MY_NAME = "John";
echo "My name is " . MY_NAME;
// Output: My name is JohnКонстанта класса читается с помощью оператора :: (разрешение области видимости) — self::PI внутри класса, Circle::PI снаружи. Глобальная константа используется по имени без $. Подробнее о классах см. в разделах классы и объекты PHP и константы класса.
Константные выражения и array
Значение const должно быть константным выражением — тем, что PHP может вычислить без выполнения кода. Допускаются литералы, операторы и другие уже определённые константы, а начиная с PHP 5.6 результатом может быть array.
<?php
const SECONDS_PER_MINUTE = 60;
const SECONDS_PER_HOUR = SECONDS_PER_MINUTE * 60; // built from another const
const ALLOWED_ROLES = ['admin', 'editor', 'viewer'];
echo SECONDS_PER_HOUR . PHP_EOL; // 3600
echo ALLOWED_ROLES[1] . PHP_EOL; // editorВызовы функций и экземпляры объектов не допускаются в значении const, поскольку они не могут быть разрешены во время компиляции.
Константы класса: видимость, интерфейсы и final
Константы класса принадлежат классу, а не отдельному объекту, поэтому для их чтения не нужен экземпляр. Начиная с PHP 7.1 им также можно назначить модификатор видимости:
<?php
interface HasStatus
{
// Interface constants are always public.
const DEFAULT_STATUS = 'pending';
}
class Order implements HasStatus
{
public const TAX_RATE = 0.2; // readable everywhere
protected const MAX_QTY = 99; // this class + subclasses
private const SECRET = 'x'; // this class only
public function status(): string
{
return self::DEFAULT_STATUS; // inherited from the interface
}
}
echo Order::TAX_RATE . PHP_EOL; // 0.2
echo (new Order())->status() . PHP_EOL; // pendingИнтерфейсы тоже могут объявлять константы (всегда публичные) — см. интерфейсы PHP. Константу класса можно пометить как final (PHP 8.1+), чтобы запретить подклассам её переопределять.
Распространённые ошибки
- Нет знака
$у константы.echo MY_NAME;работает;echo $MY_NAME;ищет переменную и завершается ошибкой. - Нельзя изменить или сбросить. Переприсвоение константы — фатальная ошибка;
unset()для констант не работает. - Только во время компиляции. Нельзя заключить
constвif, цикл или функцию, зависящую от данных времени выполнения — для этого используйтеdefine(). - Константы имеют глобальную область видимости. Глобальная
constвидна внутри функций без ключевого словаglobal, в отличие от обычной переменной.
Преимущества
- Читаемость: именованная константа, например
TAX_RATE, гораздо лучше документирует намерение, чем магическое число. - Сопровождаемость: достаточно изменить значение в одном месте, а не искать каждый литерал по всему коду.
- Безопасность: значение доступно только для чтения, поэтому его невозможно случайно перезаписать в любом месте кодовой базы.
Заключение
Ключевое слово const определяет константы времени компиляции — как глобальные, так и внутри классов — которые остаются неизменными в течение всего времени выполнения скрипта. Используйте его для фиксированных значений, известных заранее, предпочитайте константы класса для значений, принадлежащих типу, и переходите к define(), когда нужна константа, создаваемая условно или с динамическим именем. Для более глубокого изучения продолжайте с глав константы PHP и константы класса.