Напомню, что в PHP возможно определять константы. Они используются для хранения каких-то постоянных данных, которые, как правило, глобальные. Например, константа PHP_VERSION
содержит версию PHP, в которой был запущен код (а его можно запустить на разных версиях интерпретатора). Эта константа относится к предопределённым (предоставляется интерпретатором). PHP позволяет создавать свои собственные константы, используя конструкцию const SEC_PER_DAY = 86400;
. Эти константы принадлежат пространству имён и могут быть импортированы из него, используя конструкцию use const App\Times\SEC_PER_DAY;
.
<?php
// Класс встроен в язык https://php.net/manual/ru/class.datetime.php
class DateTime
{
// Константы могут быть как публичными так и приватными
public const RSS = 'D, d M Y H:i:s O';
public const RFC822 = 'D, d M y H:i:s O';
private const SOMETHING_FOR_INTERNAL_USING = 'value';
}
Внутри классов константы определяются точно таким же способом, как и снаружи. Основное отличие проявляется в способе доступа.
<?php
print_r(DateTime::RSS); // => D, d M Y H:i:s O
Синтаксически обращение происходит с использованием двух двоеточий после имени класса, за которыми, в свою очередь, идёт имя константы. Обратите внимание на отсутствие знака $
.
Для констант классов нет особого синтаксиса импорта. Он не нужен по очень простой причине — импортируется в другие пространства имён всегда класс, а константа извлекается уже из него.
Внутри класса к константе можно обратиться ровно таким же образом, но есть и другой способ:
<?php
class DateTime
{
// ...
public function getRssFormat()
{
return self::RSS;
}
}
В этом способе вместо имени класса слева стоит ключевое слово self
. Его удобство заключается в отсутствии дублирования имени класса. Эта проблема особенно актуальна при активном использовании констант внутри самого класса.
Предопределённые константы
Внутри класса определено несколько магических констант:
__CLASS__
— текущее имя класса__METHOD__
— текущее имя метода
В отличие от обычных констант, магические не требуют префикса self::
и доступны только внутри класса.
<?php
class Example
{
public function printMethodName()
{
print_r(__METHOD__);
}
}
Кроме магических, в классах есть одна специальная константа class
. Она возвращает полное имя класса и может вызываться только через класс.
<?php
namespace App;
class User
{
}
User::class; // App\User
Эта константа возвращает полное имя класса относительно пространства имён, в котором происходит её вызов.
Итого
Даже в такой простой штуке, как константы, зарыто много разных возможностей (и не факт, что это хорошо). Не пытайтесь их запомнить. В реальности всё это используется не так часто, и когда вам понадобятся константы, то вы легко найдёте всю необходимую информацию в официальной документации. Основная цель урока — показать, как бывает.
В каких случаях нужно использовать константы? В ситуациях, когда с данным типом (классом) связана некоторая важная и статическая информация (то есть не меняющаяся). Для класса DateTime
такими константами являются различные форматы даты, закреплённые разными стандартами. В целом константы не влияют на архитектуру приложения и вообще не относятся к ООП. Это просто удобное (в рамках ООП-модели PHP) добавление, полезное в некоторых ситуациях.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.