Здраствуйте. Вопрос такой: в чём удобство конструкторов\деструкторов я понимаю, а вот в чём полезность я только догадываюсь. Вот например: PHP: <?php class sql { var $link = false; function __construct() { $this->link = mysql_connect("localhost", "root", "123"); } //функции работы с MySQL. function __destruct() { mysql_close($this->link); $this->link = false; //Нужно ли это делать? } } $sql = new sql; //Подключение создано при вызове класса, не нужно вызывать дополнительные методы. Удобно. unset($sql); //Соединение разорвано. Опять-же, удобно. ?> Нужно ли в деструкторе очищать все переменные, созданные конструктором? Или я занимаюсь богохульством, а деструкторы нужны только для удобства? Вроде как при этом как-бы очищается память, что как-бы очень хорошо и как-бы повышается быстродействие и понижается нагрузка.
Да я пока просто учусь - пишу классики простые . А это просто пример, причем сейчас понял, что неудачный. В книгах говорится только как делать, а о том, зачем это нужно - ни слова. Так что до всего приходится доходить самому. Сейчас мучаю интерфейсы, а в голове конструкторы и деструкторы. Не могу понять, зачем это нужно - для очищения памяти, или удобства, или чего-то еще.
В деструкторе например, можно закрыть все файловые указатели, которые были открыты при работе с объектом. Нет. Это должен сделать "кривой" сборщик мусора.
Так как это РНР5 (деструкторы появились только в нём) лучше юзать public (тот-же var только понтов больше) или лучше protected или private (так как это ближе к "религии" ООП)
Vladson Просто недавно поднимали панику, что в PHP6 при этом будет выдаваться E_STRICT. Все зря начали переделывать скрипты)
полезность - в удобности нет. php это не c++ и он сам собирает мусор. и даже если бы не собирал - по окончании работы скрипта (а демоны на php мало кто пишет) всё один хрен бы очищалось операционкой )) php сам очищает выделенную память, когда не остаётся ни одной ссылки на объект деструктором можно например сохранять какие-то данные.. выплёвывать кэш.. писать статсы.. да что угодно, так как при нормальном завершении работы скрипта все деструкторы будут обязательно вызваны
теоретически. Не стоит забывать, что деструктор не обязательно может быть вызван при завершении скрипта - он может быть вызван в любом месте, позволяя освободить память для дальнейших вычислений.
согласен, но не думаю, что если везде навтыкать ансетов - это прибавит производительности да, я забыл это упомянуть. то-есть на деструктор не стоит привязывать события которые должны произойти именно в какой-то конкретный момент
Экономия на спичках, но зато скрипт становится почти идеальным ). Я думаю, это разные вещи. Удобство не всегда бывает полезным. Удобно не ставить закрыващих тегов в HTML, но ничего хорошего в этом нет. Хотя, по данной теме высказываение есть true;
Уверен? А если, тебе, например, надо обработать десяток файлов крупного размера? Например, изображений? как быстро у тебя кончится память?
Горбунов Олег Ну да, ситуации разные бывают. А если нужно очистить переменную со строкой "hello, world!", то на очистку уйдёт больше времени, чем времени от прироста производительности за счет экономия на памяти в дальнейших действиях (наверно).
Горбунов Олег, и при чём тут деструктор? уничтожение картинки на которую ссылается ещё кто-то - черевато глуками и кого-то. а уничтожение всех ссылок на картинку автоматом её и уничтожает.
dark-demon на примере с GD в конструкторе мы вызываем imagecreate, а в деструкторе не плохо бы вызвать imagedestroy. Сама память освобождаться просто так не будет.
Вообще, тут dark-demon прав, в интерпретируемых языках пользы от деструкторов не так много... но они есть, и иногда экономят время (мое собственное) и уменьшают кол-во потенциальных глюков «по забывчивости» (т.к. одна точка выхода)
Sergey89 Как же не будет? Ресурс GD - такая же переменная, как и любая другая. И память, отведенная под нее, автоматически высвобождается в случае, если 1) этой переменной сделали unset(), 2) мы вышли из области видимости этой переменной, другими словами, "потеряли" ее, 3) этой переменной присвоили что-нибудь другое.
Dagdamor по идее ты прав. хз. может динамические расширения могут как-то сами выделять память в обход php? Sergey89 интересно послушать: почему?