Если видео недоступно для просмотра, попробуйте выключить блокировщик рекламы.

Напомню, что в PHP есть такая конструкция как константа. Она используется для хранения каких-то постоянных данных, которые, как правило, глобальные. Например, константа PHP_VERSION содержит версию PHP, в которой был запущен код (а его можно запустить на разных версиях интерпретатора). Эта константа относится к предопределенным (предоставляется интерпретатором). PHP позволяет создавать свои собственные константы, используя конструкцию const SEC_PER_DAY = 86400;. Эти константы принадлежат неймспейсу и могут быть импортированы из него, используя конструкцию use const App\Times\SEC_PER_DAY;.

<?php

// Класс встроен в язык http://php.net/manual/ru/class.datetime.php
class DateTime
{
    const RSS = 'D, d M Y H:i:s O';
    const RFC822 = 'D, d M y H:i:s O';
}

Внутри классов константы определяются точно таким же способом, как и снаружи. Основное отличие проявляется в способе доступа.

<?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

Эта константа возвращает полное имя класса относительно неймспейса, в котором происходит ее вызов.

Модификаторы доступа

С версии PHP 7.1 константы обрели возможность иметь модификатор доступа. По умолчанию константы публичные, но если очень хочется, можно их сделать приватными.

<?php

class DateTime
{
    private const RSS = 'D, d M Y H:i:s O';
    public const RFC822 = 'D, d M y H:i:s O';
}

Итого

Даже в такой простой штуке, как константы, зарыто много разных возможностей (и не факт, что это хорошо). Не пытайтесь их запомнить. В реальности все это используется не так часто, и, когда вам понадобятся константы, то вы легко найдете всю необходимую информацию в официальной документации. Основная цель урока - показать, как бывает.

В каких случаях нужно использовать константы? В ситуациях, когда с данным типом (классом) связана некоторая важная и статическая информация (то есть не меняющаяся). Для класса DateTime такими константами являются различные форматы даты, закрепленные разными стандартами. В целом константы не влияют на архитектуру приложения и вообще не относятся к ООП. Это просто удобное (в рамках ООП модели PHP) добавление, полезное в некоторых ситуациях.


Дополнительные материалы

  1. Официальная документация
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →