Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как коректно удалить обьект.


Автор: Mushu 25.5.2009, 10:23
Перерыл книжки там не чего путного не нашел. У меня появились несколько вопросов :
1. как узнать сколько ссылок есть на данный обьект ?
2. как удалить эти ссылки
3. как вызвать деструктор в любом месте скрипта, разуметься после создание данного объекта, но не после завершение выполнение скрипта.

Я тут набросал пример в котором мне не получается удалить объект.


Код


class manager
{
    var $mass_obg;
    
}


class a
{
var $a;
static  $count;    
var $id;
 function __construct($obg_manager, $per)
 {
    
    
    $this->a = $per; 
    
    a::$count++;
    
    $this->id = a::$count; 
    
    $obg_manager->mass_obj[] =& $this;
    
 }


 
 function __destruct()
{
    
    
    unset($obg_manager->mass_obj);
    echo "обьект уничтоженн";
}
    
}



$manger = new manager();


for($i=0; $i < 4; $i++)
{
    $a[$i] = new a($manger, $i);
}

$a[1]->a = 333;
unset($a[2]);


когда уничтожаем обьект unset($a[2]); на него остается еще ссылка в  manager->mass_obj (а мы знаем что пхп __destruct() запустит тока тогда когда будут уничтожены все ссылки ), а если будут еще обьект. вот как раз хотел спросить как узнать сколько ссылок есть на уничтожающий объект ?
 

Автор: gta4kv 25.5.2009, 15:17
Цитата

Код

    unset($this);



smile smile smile
извините за оффтоп

Автор: Mushu 25.5.2009, 15:59
Цитата(gta4kv @ 25.5.2009,  15:17)
Цитата

Код

    unset($this);



smile smile smile
извините за оффтоп

Где именно ? Если в  __destruct() то до этого участка кода  всеравно не доходит.

Автор: Mushu 26.5.2009, 12:22
Есть предложение ?

Автор: bars80080 26.5.2009, 14:12
не понятно, откуда manager->mass_obj , если объект уничтожен. какая связь manager->mass_obj  и $a[2]?

Автор: Mushu 26.5.2009, 16:59
В том то и дело что он не уничтожен.

Автор: bars80080 26.5.2009, 17:44
исходя из чего сделан такой вывод?

Автор: Mushu 27.5.2009, 15:24
Идеи есть ? по уборке мусора ?

Автор: Mushu 27.5.2009, 15:24
при отладки 

Автор: youri 28.5.2009, 04:53
по поводу кода: а если error_reporting(E_ALL); ini_set("display_errors", 1); добавить?

Цитата(Mushu @  25.5.2009,  10:23 Найти цитируемый пост)
когда уничтожаем обьект unset($a[2]); на него остается еще ссылка в  manager->mass_obj (а мы знаем что пхп __destruct() запустит тока тогда когда будут уничтожены все ссылки ), а если будут еще обьект. вот как раз хотел спросить как узнать сколько ссылок есть на уничтожающий объект ?

практическая ситуация, в которой это нужно? В данном случае лучше уничтожать объекты через менеджер, добавлять тоже лучше в менеджере, а не в конструкторе объекта - ты создаешь ненужные зависимости между объектами (высокая связанность/high coupling), а лучше их избегать

Автор: Serkys 28.5.2009, 09:58
Вы, видимо, в PHP с C++ пришли.
В PHP5 отлично работает Garbage Collector, который сам удаляет объекты, на которые больше нет ссылок. К сожалению, от цикличных ссылок это не спасает (пока - в PHP5.3 проблема решена), но они встречаются редко.

Автор: Mushu 28.5.2009, 15:47
спс Я как раз думал о манагере обьектов, но как я понял в пхх еще нет данных инструментов, чтоб можно было посмотреть кто на кого ссылается.

Автор: youri 28.5.2009, 15:56
это обычно не нужно... по-крайней мере, я такие ситуации не придумал

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)