Константу определяют через ключевое слово 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 . "\n";
// Скалярное выражение
const ANOTHER_CONST = CONSTANT . ' Прощай, мир.';
echo ANOTHER_CONST . "\n";
const ANIMALS = array('dog', 'cat', 'bird');
echo ANIMALS[1] . "\n"; // Выводит "cat"
// Массивы в константе
define('ANIMALS_DEF', array(
'dog',
'cat',
'bird'
));
echo ANIMALS_DEF[1] . "\n"; // Выводит "cat"Замечание:
В отличие от определения констант функцией define() , константы, которые объявили через ключевое слово
const, требуется объявлять в самой верхней области видимости, потому что константы определяются при компилировании скрипта. Поэтому константы нельзя объявлять внутри функций, циклов, инструкцийif, или блоковtryиcatch.
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.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."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