LINUX.ORG.RU

Очень странный вопрос, скрипт ведь не обязательно должен быть быстро выполняющимся и не требущим ресурсов. При удаление объёкта деструктор может освобождать уже не нужные ресурсы, а скрипт продолжает выполняться.

mky ★★★★★
()

все сущности автоматом

ага

anonymous
()

за тем же, зачем и в других языках

Ford_Focus ★★★★★
()

Я не знаю пыхыпе, но в шарпе, например, не деструкторы, а финализаторы. Это метод, который выполняется при уничтожении объекта сборщиком мусора, момент его вызова не предсказуем, в отличии от деструктора в цпп, где он вызывается, когда объект выходит из области видимости (цпп не знаю, не бейте, если не так). Так же в шарпе есть интерфейс IDisposable, который представляет объекты, у которых есть неуправляемые ресурсы (сетевые соединения, файловые дескрипторы етц). Так вот удобно, в случае если ты всё-таки лох и не вызвал метод Dispose(), хотя бы вызвать его когда объект кончает сбоощик мусора, и хендлится это финализатором.

nikolnik ★★★
()

Ведь после исполнения скрипта все сущности автоматом дохнут

Расскажи это демонам на PHP :)

KRoN73 ★★★★★
()

А зачем они по-твоему в других языках, если программа все равно рано или поздно завершится?

Иногда мне кажется, что ЛОР перенаселен школьникам.

anonymous
()

Иногда этого просто недостаточно. Допустим, есть объект - веб сервис, который через SOAP сперва логинится, получает идентификатор сессий, с ним выполняет некоторые операции, а потом должен через SOAP вылогинится, чтоб освободить сессию. Как же это сделать? Можно при каждом обращении в этот объект указать ему логинится, выполнять нужные операции и вылогинится. Но это очень плохо, так как логин/логоут - ответственность этого объекта, а не его пользователей. Можно сделать намного лучше - при попытке выполнить команду в объекте сперва заставить объект прилогинится (если он ещё не прилогинен) и в объекте хранить идентификатор сессий. А при уничтожении объекта в деструкторе отослать команду на завершение сессии. Разница примерно такая:

По ламерски:

Объект:

class Soaper
{
	public function connect();
	public function executeCommand1();
	public function disconnect();
}
Пользователь объекта:
	$s = new Soaper();
	$s->connect();
	$s->executeCommand1();
	$s->disconnect();

По крутому:

Объект:

class Soaper
{
	protected function connect();
	public function executeCommand1() {
		if (!$this->alreadyConnected()) {
			$this->connect();
		}
                ...
	}
	protected function disconnect();
	public function __destruct() {
		$this->disconnect();
		parent::__destruct();
	}

}
Пользователь объекта:
	$s = new Soaper();
	$s->executeCommand1();

anonymous
()

есть register_shutdown_function но иногда удобен destruct, например для высвобождения ресурсов (захваченных), хотя это не очень надежно после fatal error

anonymous
()
Ответ на: комментарий от anonymous

А, да, одну мелочь забыл - по крутому должно быть так:

	...
	public function __destruct() {
		if ($this->alreadyConnected()) {
			$this->disconnect();
		}
		parent::__destruct();
	}
	...

anonymous
()

Для освобождения ресурсов, не всегда на PHP пишут код, который сразу завершается, бывают разные варианты. В нормальной системе не гоже оставлять захвачеными ресурсы, например дескрипторы на файлы, по-хорошему их нужно закрыть, чтобы освободить ресурсы для других потребителей, но конечно в наш век ИТ-упырей-смузихлёбов о таком почти не думают.

c3ph
()
Ответ на: комментарий от c3ph

век ИТ-упырей-смузихлёбов

Я еще электронку курю, верчу спиннер и езжу на гироскутере, на вас смотрю как на ископаемых :)

pleiotropy
() автор топика
Ответ на: комментарий от pleiotropy

Пустая жизнь и самое поганое, что осознаешь это уже когда не будешь достаточно пластичен чтобы всё изменить.

c3ph
()
Ответ на: комментарий от KRoN73

Ведь после исполнения скрипта все сущности автоматом дохнут

Расскажи это демонам на PHP :)

Вот, демоны писать такое на PHP! Впрочем, на Python или Perl было бы не лучше

dave ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.