Конструкторы __construct и деструкторы __destruct
Конструкторы представляют собой магические методы ООП, которые выполняются при создании объекта и служат для начальной инициализации его свойств. Для создания конструктора надо объявить функцию с именем __construct
(с двумя подчеркиваниями впереди):
<?
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
несколькими способами:
<?
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
напрямую через параметры конструктора:
<?
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 "Вызов деструктора";
}
}