W3docs

const

Узнайте, как использовать ключевое слово const в PHP для объявления глобальных и классовых констант, чем оно отличается от define().

Ключевое слово PHP const

Константа — это именованное значение, которое не может изменяться во время выполнения скрипта. Ключевое слово const — один из двух способов объявить константу в PHP (второй — функция define()). В отличие от переменной, перед именем константы нет знака $, и после её объявления нельзя ни переприсвоить значение, ни вызвать unset().

Это руководство охватывает, что делает const, чем оно отличается от define(), где его можно использовать, и распространённые ошибки, на которых спотыкаются разработчики.

Синтаксис

Вы можете использовать const на верхнем уровне скрипта (глобальная константа) или внутри класса, интерфейса или трейта (константа класса):

const NAME = value;          // global constant
class ClassName {
  const NAME = value;        // class constant, accessed as ClassName::NAME
}

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

const и define()

PHP предоставляет два инструмента, похожих внешне, но ведущих себя по-разному. Понимание их отличий сэкономит время при отладке:

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

Практика

Практика
В PHP, какие из следующих утверждений о константах являются верными?
В PHP, какие из следующих утверждений о константах являются верными?
Was this page helpful?