Люди! Ктото знает метод уничтожения экземпляра класса?

Screjet

Новичок
Люди! Ктото знает метод уничтожения экземпляра класса?

Люди! Ктото знает метод уничтожения экземпляра(объекта) класса? Перекопал мануал вдоль и поперек..
Авось ктото уже сталкивался с "этим"..

Сама проблема вот в чем:
Скачал с инета один полезный класс, но объект этого класса во время работы, на каждую операцию создает еще несколько объектов вспомогательных классов.. Естессно ниче он не зачищает за собой, а самих операций несколько..

Кто что подскажет?
 

Crazy

Developer
Важно помнить, что unset ввосе не обязательно приводит к немедленному уничтожению объекта...
 

Screjet

Новичок
Вопрос с другой стороны:
Из воспоминаний из С: free(): память освобождается, с целью ее повтоного использования.. По идее unset() как раз и занимается освобождением памяти. В часности с объектами классов, unset() этого не делает.. Баг? Вряд ли.. Я думаю объект класса содержит в себе функции, в отличии от обычного объекта ПХП, а операция unset() освобождает объект класса как обычный объект.
Вывод: unset() не подходит..
Потому и спросил, авось кто-то чтото уже стряпал на эту тему, какой-то модуль или какой-то патч..
 

Crazy

Developer
Автор оригинала: Screjet
Вопрос с другой стороны:
Из воспоминаний из С: free(): память освобождается, с целью ее повтоного использования.. По идее unset() как раз и занимается освобождением памяти.
unset не аналого free(x), а аналог x=NULL. Удаление же -- дело сборщика мусора. Пример:

PHP:
$foo = array(new A(), new B(), new C());
$bar =& $foo[0];
unset($bar);
Здесь нет причин уничтожать сами объекты...
 

ONK

Пассивист PHPСluba
Автор оригинала: Screjet
Вопрос с другой стороны:
Из воспоминаний из С: free(): память освобождается, с целью ее повтоного использования.. По идее unset() как раз и занимается освобождением памяти. В часности с объектами классов, unset() этого не делает.. Баг? Вряд ли.. Я думаю объект класса содержит в себе функции, в отличии от обычного объекта ПХП, а операция unset() освобождает объект класса как обычный объект.
Вывод: unset() не подходит..
Потому и спросил, авось кто-то чтото уже стряпал на эту тему, какой-то модуль или какой-то патч..
Объект это переменная которая содержит только информацию (свойства), методы объекта описаны в классе к которому принадлежит объект.
Так что unset вполне подходит для его уничтожения.

Собственно из-за этого (из-за необходимости получить описание методов объекта) и требуется объявлять класс перед десериализацией запакованных объектов.
 

StUV

Rotaredom
поковырялся с классами... потом перешел просто к переменным
2All: кто-нить может объяснить работу такого скрипта:

PHP:
  function ShowX(&$x)  { echo $x."<br><hr><br>"; }
  
  function UpgrX(&$x)  {
    $x.="aaaaaaaaa";
    unset($x);
  }
  function UnsetX(&$x)  {
    unset($x);
    $x.="aaaaaaaaaa";
  }

  $x = "sdfsdfsdf";
  ShowX($x);

  UpgrX($x);
  ShowX($x);

  UnsetX($x);
  ShowX($x);

  unset($x);
  ShowX($x);
(смысл скрипта думаю понятен)
а точнее вот это (при выполнении функции UnsetX):

Notice: Undefined variable: x in g:\usr\web\5.php on line 15

:)
 

ONK

Пассивист PHPСluba
А подумай что ты делаеш в этой функции?

Ты сначало уничтожаеш переменную $x, а затем пытаешся к ней прицепить строку "aaaaaaaaaa". Но переменная то уже НЕ существуе! Вот ты и видиш предупреждение, всё правильно и логично.

ВЫ ПХП есть другие баги, в некоторых случаях он создаёт вместо несуществующих переменных пустые без предупреждения что они не существовали (глюк со сылками).


PHP:
function f(){
 echo $x;
}

function k(){
 global $x;
 echo $x;
}




f();
unset($x);
k();
 

ONK

Пассивист PHPСluba
Автор оригинала: StUV
2Crazy:

а когда это происходит ?
(почему и зачем так ?)
Спасибо
У меня unset(); уничтожает пременные сразу и память освобждает тоже сразу, с итересом потестирвал бы пример где unset(); работает подругому.
 

StUV

Rotaredom
2ONK:
прикол вот в чем : что обрабатывается внутри функции при передаче аргумента по ссылке ?
точнее что ансетится внутри функции ? ведь значение строки меняется, но глобально переменная не ансетится (сравни результаты функций UpgrX и UnsetX)
:)
 

ONK

Пассивист PHPСluba
Ты внутри одной функции сначало делаеш unset(перменной); а затем пытаешся произвести конкатенацию этой переменной со строкой .


А дальше PHP молчит из-за описанного мною бага со ссылками.

Вот эта запись ShowX(&$x) эквивалент описанию функции с global $x; По хорошему ПХП должен ругаться на передачу по ссылке несуществующей переменно, но он молчит и тихо подставляет пустую строку.
 

StUV

Rotaredom
2ONK:
честно - в твой пример я не врубился :(
при регистер_глоб.. офф пхп ругается
Undefined variable: x in ... в функции f()...

-----------------
а баг насколько я понимаю - такой (хотя может и не баг :)
странным образом получается, что при передаче аргумента по ссылке некоторые операции выполняются с самим объектом ($x.=...), а в некоторых с копией (unset($x)).....

(после выполнения функции UpgrX($x)
$x == "sdfsdfsdfaaaaaaaaaa")

вопрос остается - почему ???
скажем чем арифметические операции "круче" ансета ?
риторический вопрос :)
 

ONK

Пассивист PHPСluba
Автор оригинала: StUV
2ONK:
честно - в твой пример я не врубился :(
при регистер_глоб.. офф пхп ругается
Undefined variable: x in ... в функции f()...

-----------------
а баг насколько я понимаю - такой (хотя может и не баг :)
странным образом получается, что при передаче аргумента по ссылке некоторые операции выполняются с самим объектом ($x.=...), а в некоторых с копией (unset($x)).....

(после выполнения функции UpgrX($x)
$x == "sdfsdfsdfaaaaaaaaaa")

вопрос остается - почему ???
скажем чем арифметические операции "круче" ансета ?
риторический вопрос :)
При вызове обеих функций переменная $x __НЕ__ существует, но в первой функции есть ругань на это, а во второй нет. Это и есть описанный мной баг передачи переменных по ссылкам.
 

StUV

Rotaredom
переменная $x __НЕ__ существует
а это что тогда ? :

PHP:
$x = "sdfsdfsdf";
я скрипт упростил для переменных...
изначально - написал пример с классами (попробовал ансетить объект класса его же собственным методом - не прокатывает:) )
потом уже выяснилось, что та же <...> и с переменными...

то есть ответ такой - "пхп глючит"???
-------------
можно конечно спросить нафига все это ? - интерес более деструктивный, чем конструктивный :)....
 

ONK

Пассивист PHPСluba
А вот почему unset(); внутри функций так хитро работает я не совсем понимаю. Изменять глобальное значение переменной переданной по ссылке значит можно а уничтожить её нельзя?
 

StUV

Rotaredom
2ONK:
вот-вот, с этого все и началось...
--------------------------
может гуру нам помогут :)......
 

ONK

Пассивист PHPСluba
Автор оригинала: StUV
а это что тогда ? :

PHP:
$x = "sdfsdfsdf";
Я говорил про свой пример, там переменная не существует.


сделай у себя ради интереса вот так:

ShowX(&$r);
ShowX(&$k);
ShowX(&$b);
ShowX(&$m);
ShowX(&$dfgv);
 

StUV

Rotaredom
:)
понял...
типа несуществующая переменная проставленная в аргументе функции считается существующей...

вдимо разработчики уделяли больше внимания на безопасность etc, чем на целостность языка
 
Сверху