За последние 24 часа нас посетили 72089 программистов и 1652 робота. Сейчас ищут 944 программиста ...

Удаление объекта через ссылку

Тема в разделе "Прочие вопросы по PHP", создана пользователем Amian, 26 дек 2008.

  1. Amian

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

    С нами с:
    15 мар 2007
    Сообщения:
    189
    Симпатии:
    0
    Есть ли возможность в PHP удалить объект через ссылку ?
     
  2. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    что есть объект? если речь про экземпляр какого-то класса, то гуглить что такое конструкторы и деструкторы.
     
  3. djunkie

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

    С нами с:
    19 ноя 2008
    Сообщения:
    134
    Симпатии:
    0
    объект ВМС США мб?
     
  4. Amian

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

    С нами с:
    15 мар 2007
    Сообщения:
    189
    Симпатии:
    0
    Нет, любая переменная/массив, передаваемая через ссылку. Написал небольшой пример, чтобы было понятнее:

    PHP:
    1. <?
    2.  
    3. class Test {
    4.    
    5. private $a;
    6.    
    7. function Test(){}
    8.  
    9. public function printA(){
    10.     echo "<br />Val A: ".$this->a;
    11. }
    12.  
    13. public function deleteByRef(){
    14.     unset($this->a);   
    15. }
    16.  
    17. public function setValA($data){
    18.     $this->a = $data;
    19. }
    20.  
    21. public function setRefA(&$data){
    22.     $this->a = &$data;
    23. }
    24.    
    25. }
    26.  
    27.  
    28. $_SESSION['test'] = "OK";
    29. echo $_SESSION['test'];
    30.  
    31. $obj = new Test();
    32.  
    33. $obj->setRefA(&$_SESSION['test']);
    34. $obj->printA();
    35. $obj->setValA("gy");
    36. $obj->printA();
    37. $obj->deleteByRef();
    38. $obj->printA();
    39.  
    40. echo "<br />".$_SESSION['test'];
    41.  
    42. ?>
    Результат:

    Код (Text):
    1. OK
    2. Val A: OK
    3. Val A: gy
    4. Val A:
    5. gy
    Насколько я понял unset() не удаляет объект, передаваемый через ссылку, а удаляет только саму ссылку. Можно ли это сделать как-нибудь по-другому ?
     
  5. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    первый вопрос будет: нафуя?
     
  6. Amian

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

    С нами с:
    15 мар 2007
    Сообщения:
    189
    Симпатии:
    0
    decoupling компонентов инфосистемы не только друг от друга, но и от суперглобальных переменных ?
     
  7. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    оставьте удаление объектов сборщику мусора?
     
  8. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Удаляя ссылку на переменную ты не удаляешь переменную. Присваивай переменной null, если хочешь её очистить.
     
  9. Amian

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

    С нами с:
    15 мар 2007
    Сообщения:
    189
    Симпатии:
    0
    Проблемма немного в другом, сборщик мусора и null pointers тут нипричём, так же как и не стоит вопрос с очисткой памяти ...

    Прямой вопрос: Каким образом я могу удалить элемент суперглобального массива $_SESSION['test'] через ссылку ?
     
  10. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  11. Amian

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

    С нами с:
    15 мар 2007
    Сообщения:
    189
    Симпатии:
    0
    Окей, тогда придётся делать немного коряво:

    весь массив на вход -> производим нужные действия, в том числе и операции удаления, если необходимо -> отдаём результат на выход -> присваиваем массиву новые значения. Эффект достигается вообщем-то такой-же как и от действий через ссылку - никакой привязки к суперглобальным данным, легко заменить $_POST на $_GET или $_SESSION на какой-либо другой механизм хранения данных и т.д.