#7. 5 php Конструкторы и деструкторы
Primary tabs
Конструкторы объектов
Как было показано выше, для инициализации свойств классов можно использовать соответствующие методы доступа. Но существует и другой способ присвоения значений свойствам класса при создании объекта — использование конструкторов. В PHP конструктором является метод класса со специальным именем __constuct
(имя начинается с двух подчеркиваний), которому при создании объекта могут быть переданы соответствующие данные.
Ниже приведен пример конструктора для класса Animal
, который выполняет начальную инициализацию имени животного точно так же, как это реализовано в методе set_name
:
function __construct($text) { $this->name = $text; }
При создании объекта класса Animal
данные для конструктора могут быть переданы с использованием скобок после имени класса:
$lion = new Animal("Бонифаций");
Замечание 1: Старый способ создания конструктора
В старых версиях PHP имел место другой способ создания конструктора для класса. Для этого необходимо было создать метод, имя которого совпадает с именем класса. Такой метод автоматически становился конструктором:
class Animal { private name; public function Animal($text) { $this->name = $text; } } $lion = new Animal("Бонифаций")
Начиная с PHP 7, такой способ считается устаревшим.
Следующий пример демонстрирует использование конструктора для инициализации свойства класса.
Пример 1. Использование констуктора
<HTML> <HEAD> <TITLE> Использование конструктора для инициализации объекта </TITLE> </HEAD> <BODY> <CENTER> <H1> Использование конструктора для инициализации объекта. </H1> <?php class Animal { private $name; public function __construct($text) { $this->name = $text; } public function set_name($text) { $this->name = $text; } public function get_name() { return $this->name; } } $lion = new Animal("Бонифаций"); echo "Имя нового льва: ", $lion->get_name(), "."; ?> </CENTER> </BODY> </HTML>
Результат выполнения этого примера приведен на рис. 1, из которого видно, что значение, переданное конструктору, было успешно сохранено в свойстве класса.
Параметры по умолчанию
Если в предыдущем примере мы "забудем" передать данные в конструктор и по ошибке напишем:
$lion = new Animal;
то PHP выведет соответствующие предупреждения:
Warning: Missing argument 1 for Animal::__construct() Notice: Undefined variable: name
Чтобы избежать подобной ситуации, для конструктора (как и для любых других функций и методов) мы можем задать параметры по умолчанию, например:
class Animal { ... public function __construct($text = "Бонифаций") { $this->name = $text; } ... } ...
Тогда результатом выполнения строк кода
$lion = new Animal; echo "Имя нового льва: ", $lion->get_name(), ".";
будет строка
Имя нового льва: Бонифаций.
Деструкторы
Для уничтожения объекта используется тот же самый оператор unset
, при помощи которого можно уничтожить и обычную переменную:
unset $lion;
Часто при использовании объектов возникает проблема корректного освобождения ресурсов. Например, в конструкторе объекта может открываться какой-либо файл. Дальше методы объекта каким-то образом могут манипулировать с содержимым данного файла, например, считывать или записывать данные. Наконец, при уничтожении объекта файл гарантированно должен быть закрыт, что не происходит автоматически.
Для того, чтобы гарантированно вызвать некоторый метод объекта, когда этот объект перестает использоваться в программе и удаляется из памяти, используется деструктор. Деструктор — это ещё один специальный метод класса с именем __destruct
, который будет гарантированно вызван при потере последней ссылки на объект в программе. Следующий пример демонстрирует использование деструктора в классе Animal
.
Пример 2. Добавление деструктора
<HTML> <HEAD> <TITLE> Вызов деструктора </TITLE> </HEAD> <BODY> <CENTER> <H1> Вызов деструктора. </H1> <?php class Animal { private $name; public function __construct($text) { $this->name = $text; } public function set_name($text) { $this->name = $text; } public function get_name() { return $this->name; } public function __destruct() { echo "Объект ", $this->name, " уничтожен.<BR>"; } } $lion = new Animal("Бонифаций"); echo "Имя нового льва: ", $lion->get_name(), ".<BR>"; $lion = new Animal("Симба"); echo "Имя нового льва: ", $lion->get_name(), ".<BR>"; echo "Конец программы."; ?> </CENTER> </BODY> </HTML>
Результат выполнения примера на рис. 2.
Таким образом, объект с именем "Бонифаций" был уничтожен при перезаписи переменной $lion
, т.к. была потеряна последняя (и единственная) ссылка на этот объект. Деструктор объекта с именем "Симба" был вызван при завершении программы.
- Log in to post comments
- 733 reads
mariyas
Fri, 09/15/2023 - 14:51
Permalink
Добавлено
Добавлено: 1) Замечания 1 и 2
2) "Параметры по умолчанию"
3) "Деструкторы"
4) "Алгоритм сбора мусора"