Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Конструктор PHP: Введение в ООП

Структура в Си может быть инициализирована значениями прямо при создании.

int main()
{
    // Создание переменной p1 типа point.
    point p1 = { .x = 0, .y = 1 };
}

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

<?php

class Point
{
    public $x;
    public $y;

    public function __construct($x, $y)
    {
        $this->x = $x;
        $this->y = $y;
    }
}

$point = new Point(1, 10);
$point->x; // 1
$point->y; // 10

Конструктор класса — функция с именем __construct. Эту функцию невозможно вызвать напрямую. Она вызывается автоматически во время создания объекта new Point(5, 3), а параметры, переданные в этот вызов, сразу попадают в конструктор. Это значит, что, если в классе определён конструктор с двумя обязательными параметрами, то создание объекта всегда потребует два обязательных параметра. Сам по себе конструктор подчиняется тем же правилам, что и обычные функции, например, при необходимости можно указать значения по умолчанию. PHP в силу динамической природы допускает создание ровно одного конструктора на класс.

Конструктор не может и не должен ничего возвращать (технически вы можете написать return, но этот возврат никем не используется).

Самое интересное происходит внутри конструктора. Во-первых, конструктор вызывается тогда, когда объект уже создан. Этот объект доступен внутри конструктора как переменная $this. Такое поведение может показаться странным, ведь, глядя на эту конструкцию $point = new Point(1, 10), видно, что правая часть выполняется раньше присваивания, а значит и конструктор вызывается раньше. Ответ кроется в том, какая логика скрывается за оператором new. Процесс создания объекта внутри PHP выглядит следующим образом:

  1. Создаётся объект без вызова чего-либо. Технически внутри интерпретатора создается та самая структура из языка Си (PHP написан на Си).
  2. Вызывается конструктор, в который передаётся объект. Синтаксически этой передачи не видно, но она есть. Можно сказать, что объект попадает внутрь конструктора как нулевой параметр, то есть внутри PHP для нашего класса, определённого выше, сигнатура конструктора выглядит так: __construct($this, $x, $y).
  3. Объект $this наполняется в соответствии с кодом, находящимся в теле функции __construct. Так как объект всегда передаётся по указателю, то возврат из конструктора не нужен.
  4. Объект возвращается наружу. В этот момент отрабатывает присваивание.

Основная задача конструктора — заполнить свойства объекта переданными параметрами. Этот способ сложнее, чем тот, который мы рассматривали в структурах (где ничего не надо определять, а можно заполнять при создании), и вот почему:

  1. Свойства могут быть защищены от прямого изменения или чтения. Этот вопрос рассматривается позже.
  2. Свойства могут требовать дополнительных расчётов, как, например, в ситуации с точками, которую мы рассматривали ранее, где происходило преобразование входных координат в другой способ представления.
  3. В конструкторе можно выполнять различные побочные эффекты, например, читать файлы или выполнять сетевые вызовы (открыть соединение с базой данных). С этой возможностью нужно быть очень осторожным. Побочные эффекты резко усложняют код и затрудняют тестирование.

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

  1. Официальная документация

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Занимайтесь созданием сайтов, веб-приложений, сервисов и их интеграцией с внутренними бизнес-системами на бекенд-языке PHP
10 месяцев
с нуля
Старт 10 октября

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»