За последние 24 часа нас посетили 18179 программистов и 1589 роботов. Сейчас ищет 1031 программист ...

Польза конструкторы\деструкторы

Тема в разделе "PHP для новичков", создана пользователем +Sten+, 6 дек 2007.

  1. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Здраствуйте.
    Вопрос такой: в чём удобство конструкторов\деструкторов я понимаю, а вот в чём полезность я только догадываюсь.
    Вот например:
    PHP:
    1.  
    2. <?php
    3. class sql
    4. {
    5.  var $link = false;
    6.  function __construct()
    7.  {
    8.   $this->link = mysql_connect("localhost", "root", "123");
    9.  }
    10.  
    11. //функции работы с MySQL.
    12.  
    13.  function __destruct()
    14.  {
    15.   mysql_close($this->link);
    16.   $this->link = false; //Нужно ли это делать?
    17.  }
    18. }
    19. $sql = new sql; //Подключение создано при вызове класса, не нужно вызывать дополнительные методы. Удобно.
    20. unset($sql);      //Соединение разорвано. Опять-же, удобно.
    21. ?>
    22.  
    Нужно ли в деструкторе очищать все переменные, созданные конструктором? Или я занимаюсь богохульством, а деструкторы нужны только для удобства?
    Вроде как при этом как-бы очищается память, что как-бы очень хорошо и как-бы повышается быстродействие и понижается нагрузка.
     
  2. Anonymous

    Anonymous Guest

    «Перестаньте думать об ООП на уровне класса для работы с БД» (с) armadillo, AFAIK. ;)
     
  3. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Да я пока просто учусь - пишу классики простые :). А это просто пример, причем сейчас понял, что неудачный.
    В книгах говорится только как делать, а о том, зачем это нужно - ни слова. Так что до всего приходится доходить самому.

    Сейчас мучаю интерфейсы, а в голове конструкторы и деструкторы. Не могу понять, зачем это нужно - для очищения памяти, или удобства, или чего-то еще.
     
  4. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    В деструкторе например, можно закрыть все файловые указатели, которые были открыты при работе с объектом.
    Нет. Это должен сделать "кривой" сборщик мусора.
     
  5. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Кажется, начинаю понимать.
     
  6. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Так как это РНР5 (деструкторы появились только в нём) лучше юзать public (тот-же var только понтов больше) или лучше protected или private (так как это ближе к "религии" ООП)
     
  7. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Vladson
    в PHP6 var будет синонимом public. Короче и в ногу со временм )
     
  8. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Он и сейчас не особо от него отличается :)
     
  9. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Vladson
    Просто недавно поднимали панику, что в PHP6 при этом будет выдаваться E_STRICT. Все зря начали переделывать скрипты)
     
  10. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Брось ты, паниковать по E_STRICT :)
     
  11. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Разве удобство не является полезностью?
     
  12. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    полезность - в удобности :)

    нет. php это не c++ и он сам собирает мусор. и даже если бы не собирал - по окончании работы скрипта (а демоны на php мало кто пишет) всё один хрен бы очищалось операционкой ))

    php сам очищает выделенную память, когда не остаётся ни одной ссылки на объект

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

    Anonymous Guest

    теоретически.

    Не стоит забывать, что деструктор не обязательно может быть вызван при завершении скрипта - он может быть вызван в любом месте, позволяя освободить память для дальнейших вычислений.
     
  14. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    неа, не обязательно. при падении, например, они не вызываются.
     
  15. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
     
  16. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    согласен, но не думаю, что если везде навтыкать ансетов - это прибавит производительности

    да, я забыл это упомянуть. то-есть на деструктор не стоит привязывать события которые должны произойти именно в какой-то конкретный момент

     
  17. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Экономия на спичках, но зато скрипт становится почти идеальным ).

    Я думаю, это разные вещи. Удобство не всегда бывает полезным. Удобно не ставить закрыващих тегов в HTML, но ничего хорошего в этом нет. Хотя, по данной теме высказываение есть true;
     
  18. Anonymous

    Anonymous Guest

    Уверен? А если, тебе, например, надо обработать десяток файлов крупного размера? Например, изображений? как быстро у тебя кончится память?
     
  19. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Горбунов Олег
    Ну да, ситуации разные бывают. А если нужно очистить переменную со строкой "hello, world!", то на очистку уйдёт больше времени, чем времени от прироста производительности за счет экономия на памяти в дальнейших действиях (наверно).
     
  20. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    смешной топег...
     
  21. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Горбунов Олег, и при чём тут деструктор? уничтожение картинки на которую ссылается ещё кто-то - черевато глуками и кого-то. а уничтожение всех ссылок на картинку автоматом её и уничтожает.
     
  22. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    dark-demon на примере с GD в конструкторе мы вызываем imagecreate, а в деструкторе не плохо бы вызвать imagedestroy. Сама память освобождаться просто так не будет.
     
  23. Anonymous

    Anonymous Guest

    Вообще, тут dark-demon прав, в интерпретируемых языках пользы от деструкторов не так много... но они есть, и иногда экономят время (мое собственное) и уменьшают кол-во потенциальных глюков «по забывчивости» (т.к. одна точка выхода)
     
  24. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Sergey89
    Как же не будет? Ресурс GD - такая же переменная, как и любая другая. И память, отведенная под нее, автоматически высвобождается в случае, если 1) этой переменной сделали unset(), 2) мы вышли из области видимости этой переменной, другими словами, "потеряли" ее, 3) этой переменной присвоили что-нибудь другое.
     
  25. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    Dagdamor
    по идее ты прав. хз. может динамические расширения могут как-то сами выделять память в обход php?

    Sergey89 интересно послушать: почему?