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

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

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

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

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

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

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

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

Вторая группа — это методы объекта.

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

Классы

Класс — это шаблон, по которому создаются объекты.

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

Класс как чертёж

Зачем нужны классы, и почему объекты не могут существовать без них?

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

Жизненный цикл объекта

✅ Любая работа с объектами в PHP состоит из следующих этапов.

  • Начинаем с создания класса. В нём фиксируем, из каких свойств и методов будет состоять каждый его экземпляр, задаём начальные значения для каждого свойства. Имея класс, возможно создать его экземпляр — объект.

  • Классы в PHP принято сохранять в отдельных файлах, поэтому вначале подключаем этот сценарий там, где он необходим. Затем вызываем процедуру создания нового объекта на основе этого класса.

  • Чтобы использовать объект в дальнейшем, его следует назначить переменной. Далее будем работать с объектом через переменную: вызывать методы и обращаться к свойствам.

Пример создания объекта на основе класса

Описание класса:

class WeatherEntry
{

    private $date;
    private $comment = "";
    private $temperature = 0;

    private $isRainy = false;

    public function __construct($date, string $comment, int $temperature)
    {
        $this->date = $date;
        $this->comment = $comment;
        $this->temperature = $temperature;
    }

    public function isCold()
    {
        return $this->temperature < 0;
    }

    public function setRainStatus($rain_status)
    {
        $this->isRainy = $rain_status;
    }

    public function getDayDescription()
    {
        $dt = strtotime($this->date);
        $delta = time() - $dt;
        $days = ceil($delta / 86400);

        $res = "Это было $days дней назад. В тот день было";

        if ($this->isCold()) {
            $res .= "холодно. ";
        }
        else {
            $res .= "довольно тепло.";
        }

        if ($this->isRainy) {
            $res .= "Семенил дождь.";
        }
        else {
            $res .= "На небе не было ни облачка.";
        }

        return $res;
    }
}

Создание объекта на основе класса:

$firstSeptember = new WeatherEntry("2018-09-01", "День знаний", 14);
$firstSeptember->setRainStatus(false);

print($firstSeptember->getDayDescription());

Разбор примера

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

В классе определено четыре скрытых свойства. Это значит, что к ним не будет доступа за пределами объекта. Читать и записывать эти свойства могут только внутренние методы объекта. Сами свойства хранят температурные параметры (температуру, осадки), дату и дополнительный комментарий к записи. Некоторым свойствам задано значение по умолчанию.

Далее идёт перечисление методов. И начинается всё с метода, у которого особое имя и значение — __construct.

Что такое конструктор объекта

Методы объекта вызываются из внешнего кода, при явном обращении к ним с указанием имени. Но если назвать один метод __construct, то он будет вызываться автоматически в момент создания объекта на основе класса.

Конструкторы объектов используются для инициализации каких-либо значений и в выполнении других подготовительных операций. В нашем примере конструктор устанавливает содержимое скрытых свойств.

Обращение к свойствам и методам объекта

Посмотрим, как внутри метода происходит обращение к свойствам.

Во-первых, для этого используется специальная переменная this, которая всегда присутствует внутри объекта и ссылается на него самого.

Во-вторых, для обращения к методам и свойствам объекта нужен специальный синтаксис: «стрелочка». Такая стрелочка отделяет имя свойства или метода от имени объекта. Это аналог квадратных скобок при работе с массивами.

Метод с именем isCold() нужен, чтобы узнать, было ли холодно в тот день, основываясь на показаниях температуры в градусах.

Метод setRainStatus() устанавливает логическое значение, которое показывает статус осадков в день наблюдения.

Метод getDayDescription() формирует текстовое описание погоды на заданную дату.

Создание объекта на основе класса

Написав класс, мы выполнили большую часть работы. Теперь создадим новый объект на основе класса и посмотрим, как с ним работать.

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

В коде передаём в конструктор почти все параметры погодных наблюдений. Затем для созданного объекта вызываются его методы: первый устанавливает значения осадков, а второй возвращает текстовое описание погоды.