Синтаксис

Константу определяют через ключевое слово 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.

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

Добавить

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

up
46
souzanicolas87 at gmail dot com
3 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
7
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.
up
1
povares at skippergroupe dot com
2 months ago
"const is defined at compile time" may not be true, depending on what you call "defining".

Although you can't define a const inside an if, like

if ($c === 'a') {
const c = a;
}
else {
const c = b;
}
# Results in a parse error

you can assign it a value depending on a conditionnal 'define' constant

$a = 1;

if ($a === 1) {
define('a', 'one');
}
else {
define('a', 'two');
}

const c = a;
# Valid, c equals "one"

https://onlinephp.io/c/b8227
To Top