Конструкторы и деструкторы

Последнее обновление: 18.03.2021

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

Функция деструктора определяется без параметров, и когда на объект не останется ссылок в программе, он будет уничтожен, и при этом будет вызван деструктор.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850