Verification: a143cc29221c9be0

Php class класс в классе

Предопределённые константы

Внутри класса определено несколько магических констант:

  • __CLASS__ — текущее имя класса
  • __METHOD__ — текущее имя метода

В отличие от обычных констант, магические не требуют префикса self:: и доступны только внутри класса.

class Example
{
    public function printMethodName()
    {
        print_r(__METHOD__);
    }
}

Кроме магических, в классах есть одна специальная константа class. Она возвращает полное имя класса и может вызываться только через класс.

namespace App;

class User
{
}

User::class; // App\User

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

Объекты

Объекты в PHP — это просто ещё один тип данных. Объект позволяет хранить в переменной набор из свойств и их значений, а также встроенные функции. Это делает объекты похожими по своей структуре на ассоциативные массивы. Но отличие от массивов всё-таки есть, и при этом достаточно важное — объекты могут иметь внутреннее состояние.

Особенности объектов и их отличия от массивов

Давайте разберёмся, что такое PHP-объект. Как сказано выше, объекты похожи на массивы, но со своими особенностями. Объекты могут содержать отдельные значения, каждое под своим ключом. Эти значения называются свойствами объекта.
Также объекты могут иметь внутри себя функции — их называют методами объекта. Методы могут обращаться к любым свойствам объекта, читать и записывать туда данные.

Значение свойства объекта может быть любого типа: число, строка, массив, другой объект. Но, в отличие от массива, объекты не позволяют добавлять в себя новые значения. То есть объект всегда имеет конечное число своих свойств и методов. Менять значения существующих свойств можно, а удалять и заменять их — нельзя. Что в корне отличается от поведения массива, ведь там добавлять и удалять значения можно в любое время.

Но самая большая особенность объектов — это то, как они создаются. Если массив создается либо пустым, либо сразу с набором значений, то объекты устроены иначе. Дело в том, что объекты не существуют сами по себе. Чтобы создать новый объект, вам придётся вначале создать его описание — класс.
Класс — это как бы чертёж объекта. Класс описывает то, из чего состоит объект. Мы разберёмся с классами чуть позже.

Анатомия объекта

Как же устроен объект изнутри? Его содержимое можно поделить на две группы: свойства и методы.
Свойства могут быть двух видов: публичные и скрытые. К публичным свойствам можно обращаться за пределами объекта, точно так же, как вы обращаетесь к элементам массива по его ключам.
Скрытые свойства не имеют аналогов в массиве. Они доступны для чтения и изменения только внутри самого объекта — и это могут делать его методы.

Вторая группа — это методы объекта.
Набор методов также называется поведением объекта. Как и свойства, методы бывают публичными и скрытыми. Публичные методы объекта можно вызывать из внешнего кода, а скрытые только из самого объекта. Методы способны обращаться к свойствам объекта также просто, как если бы это были их внутренние переменные или аргументы.

Зачем?

Трейты в отличие от наследования, не фиксируют структуру классов. Любой класс может включать в себя любое количество трейтов:

class MySuperClass
{
    use FirstTrait;
    // При включении возможны конфликты имён. Подробнее про их разрешение:
    // https://www.php.net/manual/ru/language.oop5.traits.php#language.oop5.traits.conflict
    use SecondTrait;
}

Эта структура располагает к выделению общих признаков из совершенно разнообразных классов. Пример с Magic как раз хорошо демонстрирует такой подход. Многие классы одинаково реализуют магические методы и нет смысла дублировать их код. И точно не стоит использовать наследование, так как оно свяжет совершенно несвязанные классы в общую (и жёсткую) иерархию.

Трейты позволяют реализовать многие интерфейсы PHP универсальным образом, например, ArrayAccess или Iterator