Конструкторы представляют специальные методы, которые выполняются при создании объекта и служат для начальной инициализации его свойств. Для создания конструктора надо объявить функцию с именем __construct (с двумя подчеркиваниями впереди):
<?php class Person { public $name, $age; function __construct($name, $age) { $this->name = $name; $this->age = $age; } function displayInfo() { echo "Name: $this->name; Age: $this->age<br>"; } } $tom = new Person("Tom", 36); $tom -> displayInfo(); $bob = new Person("Bob", 41); $bob -> displayInfo(); ?>
Функция конструктора в данном случае принимает два параметра. Их значения передаются свойствам класса. И теперь чтобы создать объект, нам надо передать значения для соответствующих параметров:
$tom = new Person("Tom", 36);
Вывод браузера:
Name: Tom; Age: 36 Name: Bob; Age: 41
Чтобы сделать конструктор более гибким, мы можем обозначить один или несколько параметров в качестве необязательных. Тогда при создании объекта необязательно указывать все параметры. Например, изменим конструктор следующим образом:
function __construct($name="Том", $age=36) { $this->name = $name; $this->age = $age; }
Таким образом, если не будут заданы параметры, вместо них будут использоваться значения "Том" и 36. И теперь мы можем создать объект Person несколькими способами:
<?php class Person { public $name, $age; function __construct($name="Том", $age=36) { $this->name = $name; $this->age = $age; } function displayInfo() { echo "Name: $this->name; Age: $this->age<br>"; } } $tom = new Person(); $tom -> displayInfo(); $bob = new Person("Bob"); $bob -> displayInfo(); $sam = new Person("Sam", 29); $sam -> displayInfo(); ?>
Вывод браузера:
Name: Том; Age: 36 Name: Bob; Age: 36 Name: Sam; Age: 29
Начиная с версии PHP 8 в языке появилась возможность определить свойства через список параметров конструктора. Любой параметр конструктора, который имеет модификатор доступа, например, public, будет автоматически представлять новое свойство.
Например, определим свойства name и age напрямую через параметры конструктора:
<?php class Person { function __construct(public $name, public $age) { $this->name = $name; $this->age = $age; } function displayInfo() { echo "Name: $this->name; Age: $this->age<br>"; } } $tom = new Person("Tom", 36); $tom -> displayInfo(); ?>
Хотя в данном случае в классе явным образом не определены свойства name и age, но поскольку в списке параметров конструктора заданы параметры
с такими именами и с модификатором доступа (в данном случае public
), то у класса автоматически создаются подобные переменные.
Можно сочетать оба способа объявления переменных:
class Person { public $name; function __construct($name, public $age) { $this->name = $name; $this->age = $age; } function displayInfo() { echo "Name: $this->name; Age: $this->age<br>"; } }
При подобном объявлении свойств также можно передавать им значения по умолчанию:
class Person { public $name; function __construct($name = "Sam", public $age = 33) { $this->name = $name; $this->age = $age; } function displayInfo() { echo "Name: $this->name; Age: $this->age<br>"; } }
Деструкторы служат для освобождения ресурсов, используемых программой - для освобождения открытых файлов, открытых подключений к базам данных и т.д. Деструктор объекта вызывается самим интерпретатором PHP после потери последней ссылки на данный объект в программе.
Деструктор определяется с помощью функции __destruct (два подчеркивания впереди):
class Person { public $name, $age; function __construct($name, $age) { $this->name = $name; $this->age = $age; } function getInfo() { echo "Имя: $this->name ; Возраст: $this->age <br>"; } function __destruct() { echo "Вызов деструктора"; } }
Функция деструктора определяется без параметров, и когда на объект не останется ссылок в программе, он будет уничтожен, и при этом будет вызван деструктор.