Синтаксис

Константу определяют через ключевое слово const или функцией define(). Функция define() разрешает определить константу для произвольного выражения, тогда как у конструкции const есть ограничения, которые описывает следующий параграф. После определения константу нельзя изменить или сделать неопределённой.

При определении константы через ключевое слово const допускаются только скалярные выражения (bool, int, float и string) и массивы (array), которые содержат только скалярные выражения. Разрешается определять константы с типом resource, но не рекомендуется, поскольку это приводит к неожиданным результатам.

Значение константы получают по имени константы. Не нужно указывать перед именем константы символ $, как перед переменными. Значение константы также получают функцией constant(), если имя константы формируется динамически. Список всех определённых констант получают функцией get_defined_constants().

Замечание: Константы и (глобальные) переменные находятся в разных пространствах имён. Это означает, например, что логическая константа true и переменная $TRUE — не одно и то же.

При попытке обратиться к неопределённой константе выбрасывается исключение Error До PHP 8.0.0 неопределённые константы интерпретировались как простое строковое (string) слово, то есть CONSTANT сравнивалось с "CONSTANT". Этот резервный вариант объявили устаревшим в PHP 7.2.0, при этом будет сгенерирована ошибка уровня E_WARNING. До PHP 7.2.0 вместо этого выдавалась ошибка уровня E_NOTICE. Смотрите также главу руководства, которая разъясняет, почему $foo[bar] — это неправильно (если только bar не константа). Это не относится к полным и абсолютным константам, которые каждый раз будут выбрасывать исключение Error, если эти константы не определили.

Замечание: Чтобы проверить, установили ли константу, вызывают функцию defined().

Отличия констант от переменных:

  • У констант нет приставки в виде знака доллара $;
  • Константы разрешается определять и получать доступ к ним в любом месте без учёта области видимости;
  • Константы нельзя переопределять или удалять после первоначального объявления;
  • Константам разрешено содержать только скалярные значения или массивы.

Пример #1 Определение констант

<?php

define
("CONSTANT", "Здравствуй, мир.");
echo
CONSTANT; // Выводит "Здравствуй, мир."
echo Constant; // Выбросит ошибку: Неопределённая константа Constant
// До PHP 8.0.0 выводит "Constant" и выдаёт предупреждение.

?>

Пример #2 Определение констант через ключевое слово const

<?php

// Простое скалярное значение
const CONSTANT = 'Здравствуй, мир.';

echo
CONSTANT;

// Скалярное выражение
const ANOTHER_CONST = CONSTANT . ' Прощай, мир.';
echo
ANOTHER_CONST;

const
ANIMALS = array('dog', 'cat', 'bird');
echo
ANIMALS[1]; // выводит "cat"

// Массивы в константе
define('ANIMALS', array(
'dog',
'cat',
'bird'
));
echo
ANIMALS[1]; // выводит "cat"

?>

Замечание:

В отличие от определения констант функцией define(), константы, которые объявили через ключевое слово const, требуется объявлять в самой верхней области видимости, потому что константы определяются при компилировании скрипта. Поэтому константы нельзя объявлять внутри функций, циклов, инструкций if и блоков try и catch.

Смотрите также

Добавить

Примечания пользователей 2 notes

up
35
souzanicolas87 at gmail dot com
2 years ago
the documentation doesn't go too far in explaining the crucial difference between the two ways of declaring constants in PHP.

Const is handled at compile time, define() at run time. For this reason, a constant cannot be conditionally defined using Const, for example.

Another difference we can notice occurs in the constant declarations in classes. Const infiltrates the class scope, while define() leaks into the global scope.

<?php

Class Myclass (){
const
NAME = "Nicolas";
}

?>

The NAME constant is within the scope of the MyClass class.
up
9
login at (two)view dot de
7 years ago
Just a quick note:
From PHP7 on you can even define a multidimensional Array as Constant:

define('QUARTLIST',array('1. Quarter'=>array('jan','feb','mar'),'2.Quarter'=>array('may','jun','jul'));

does work as expected.
To Top