Структура в Си может быть инициализирована значениями прямо при создании.
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 выглядит следующим образом:
__construct($this, $x, $y)
.$this
наполняется в соответствии с кодом, находящимся в теле функции __construct
. Так как объект всегда передаётся по указателю, то возврат из конструктора не нужен.Основная задача конструктора — заполнить свойства объекта переданными параметрами. Этот способ сложнее, чем тот, который мы рассматривали в структурах (где ничего не надо определять, а можно заполнять при создании), и вот почему:
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт