Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

Деструкторы в php - какой в них смысл?

#php


Начал изучение магических методов PHP. С большинством все понятно. Но вот __destruct(),
я не могу понять практическое применение его именно в PHP. В каких случаях он нужен
вообще? Время жизни объектов же крайне не большое. Какая практическая польза? 

Всем спасибо за ответы. Конкретно определить самый правильный не могу. Много интересных
вещей написано в комментариях.
    


Ответы

Ответ 1



Деструктор позволяет вашим объектам предоставлять гарантии по управлению ресурсами. В деструкторе вы можете написать логику, которая так или иначе - во время сборки мусора или при выключении VM - будет выполнена, и не оставит ваше приложение в неконсистентном состоянии. Сама логика может быть произвольной - чаще всего в пример приводят файл, который необходимо закрыть. Клиентский код может забыть это сделать, и тогда работу за него произведет деструктор. В качестве более интересного примера можно привести ссылочную систему: например, в системе есть кэш с коротким временем жизни, который самоуничтожается после того, как последний клиент отключился. В этом случае в деструкторе клиента такого кэша должна выполняться логика дерегистрации, чтобы кэш вовремя смог освободить оперативную память. При этом все нельзя забывать, что машина, на которой выполняется код, ненадежна и может упасть прямо посередине какой-либо транзакции - в этом случае код в деструкторе не выполнится.

Ответ 2



деструктор вызываеться при завершение скрипта и при освобождение ссылок т.е. если у нас есть myClass с содержимым class myClass { public function __construct() { echo 'construct'; } public function __destruct() { echo 'destruct'; } } то при выполнение $test = new myClass(); unset($test); //destruct $test = null; //destruct exit(); // destruct Но если смотреть на web программирование. то при завершение скрипта все ресурсы которорые были задействованы освобождаються автоматически(по этому использование сдесь его не целесообразно). Если смотреть на 'демоны' на php. Он будет срабатывать на unset($object), но тут тоже вопрос будет ли этот unset или его не будет, а реализованно всё это будет как register т.е. нужин ли нам instance объекта постоянно и неизменно, в конце концов нужны ли объекты вообще...

Ответ 3



Я когда-то писал класс, который записывает в базу данных активность пользователя, обновляет время последнего посещения, браузер и т.д. Так вот в конструкторе я указывал мне нужные переменные, базы например. А в деструкторе, чтобы не писать одну строчку где-либо в коде, обновлял всю инфу в базе. Может быть это глупо, не знаю. Ну в общем достойное придумать для деструктора что-то можно)

Комментариев нет:

Отправить комментарий