Константы также могут быть объявлены и в пределах одного класса. Отличие переменных и констант состоит в том, что при объявлении последних или при обращении к ним не используется символ $ .
Значение должно быть неизменяемым выражением, не (к примеру) переменной, свойством, результатом математической операции или вызовом функции.
Интерфейсы также могут содержать константы (constants). За примерами обращайтесь к разделу об интерфейсах.
Начиная с версии PHP 5.3.0, стало возможным обратиться к классу с помощью переменной. Значение переменной не должно быть ключевым словом (например, self, parent или static).
Пример #1 Объявление и использование константы
class MyClass
<
const CONSTANT = ‘значение константы’ ;
function showConstant () <
echo self :: CONSTANT . "
" ;
>
>
echo MyClass :: CONSTANT . "
" ;
$classname = "MyClass" ;
echo $classname :: CONSTANT . "
" ; // начиная с версии PHP 5.3.0
$class = new MyClass ();
$class -> showConstant ();
echo $class :: CONSTANT . "
" ; // начиная с версии PHP 5.3.0
?>
Пример #2 Пример со статичными данными
В отличие от heredoc, nowdoc может быть использован в любом контексте статичных данных.
Поддержка nowdoc была добавлена в версии PHP 5.3.0.
Внутри классов можно определять свои константы. Для этого используется слово const .
По сложившейся традиции имена констант задаются большими буквами.
Пример указания констант в классе
Вот пример класса с тремя константами:
Обратите внимание, перед именем константы мы не ставили знак $ , этим константы отличаются от обычных свойств.
Также обратите внимание, что мы получили доступ к этой константе используя ключевое слово self и оператор " :: ".
Попытка обратиться к константе используя псевдопеременную $this , то есть таким образом $this->BOOKS , приведёт к ошибке.
В данном примере при помощи этой переменной не получится обратиться даже к обычному свойству:
Получаем сообщение "Using $this when not in object context in . ". Так и должно быть, так как мы обратились к методу класса напрямую, не создавая объект, а $this работает только в контексте объекта.
Ещё раз: ключевое слово self предназначено только для обращения к константе из метода класса. Оно является аналогом псевдопеременной $this для доступа к свойствам.
Константы недоступны объектам. Это лекго понять на следующем примере.
В нашем объекте есть только свойтво $age . Констант в нём нет.
Объект состоит только из свойств, также используя его можно получить доступ к методам. Если добавить в класс метод, то в print_r() мы это не увидим.
В этой заметке разберемся, в чем разница в объявлении PHP констант с помощью ключевого слова const и функции define() .
Константы в PHP — это «постоянные», значения которых указывается всего один раз и затем не может быть изменено. При попытке изменить значение, оно не изменится и появится PHP заметка: «Constant already defined» (константа уже определена):
Объявлять константы в PHP можно двумя способами:
У каждого способа есть свои особенности, чтобы их понять, давайте рассмотрим все поэтапно, как и что менялось с каждой версией PHP.
Как создавать константы
PHP меньше 5.3
До 5.3 в PHP, константы можно было определять только через define() . Ключевое слово const появилось с версии 5.3.
Константы могут хранить только скаляры. Скалярные переменные — это переменные с типами integer , float , string и boolean . Типы array , object и resource не являются скалярными.
С версии PHP 5.3
Появилось ключевое слово const и теперь константу можно определять еще и с помощью него.
Однако, в const нельзя указать переменную, функцию или какое то выражение, а нужно передавать скаляр «напрямую»:
Тогда как для define() таких ограничений нет.
PHP 5.6
Стало возможным указывать в значения const примитивные PHP выражения (выражения из скаляров):
Стало возможным хранить массивы в константах:
Разница между define() и const
#1 const должны быть объявлены в верхней области
В отличие define() , const должны быть объявлены в самой верхней области видимости, потому что они определяются при компилировании скрипта. Это значит, что их нельзя объявлять внутри функций/циклов/выражений if или try/catch блоков.
#2 const всегда регистрозависима
const всегда регистро-зависима, в то время как define() позволяет сделать регистро-независимые константы:
#3 const понимает только скаляры
Это справедливо только для версий PHP 5.6 и ниже.
const нельзя передать переменные, функции, выражения, а define() можно:
#4 const может хранить массивы с версии PHP 5.6 а define с PHP 7.0
Итоги сравнения
Определять константу почти всегда лучше с помощью define() , потому что тут больше возможностей и меньше вариантов «поймать» ошибку. Исключение — это когда у вас версия PHP 5.6 и вам нужно сохранить массив в константу, тут поможет const .
Константы PHP класса
Объявляются только с помощью const . Правила для них такие как описано выше: принимают только скаляры, не понимают PHP переменные, функции, выражения.
Постоянные класса всегда общедоступны — нет статуса private или protected .
Объявленная константа принадлежит именно классу, она не принадлежит ни одному объекту и является общей на все объекты (экземпляры) класса.
Константы для классов очень похожи на статические (static) свойства класса.
И в заключении вспомним про особые константы PHP.
В PHP есть девять волшебных констант, которые меняют свое значение в зависимости от контекста, в котором они используются. Например, значение __LINE__ зависит от строки в скрипте, на которой эта константа указана. Все "волшебные" константы разрешаются во время компиляции, в отличии от обычных констант, которые разрешаются во время исполнения. Специальные константы нечувствительны к регистру и их список приведен ниже: