Зарегистрируйтесь для доступа к 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. Официальная документация

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

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

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

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Для полного доступа к курсу нужна профессиональная подписка

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

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

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

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

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

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
29 сентября 8 месяцев

Есть вопрос или хотите участвовать в обсуждении?

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

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»