Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Уничтожение объекта класса 
:(
    Опции темы
redlinesoft
Дата 13.7.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 4.8.2005

Репутация: нет
Всего: нет



Сейчас занимаюсь разработкой CMS на php5. Написал класс управления модулями, оформленных так же в виде классов.
Этот класс имеет две функции, в которых необходимо создать новый экземпляр модуля.
Но при тесте получил error с тектом:
Fatal error: Cannot redeclare class modulconfig_123 in y:\home\wd\www\admin\modules\123\config.php on line 3
Так вот: кто-нибудь подскажите, как уничтожить экземпляр класса, если он ужн не нужен. 
PM MAIL   Вверх
GiV
Дата 13.7.2006, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: нет
Всего: 9



Здраствуйте, 

У Вас проблема не в том что у Вас создан экземпляр класса, а в том, что Вы пытаетесь еще раз подключить файл с описанием класса.
Экземпляров класса в программе может быть сколь угодно много, а вот его декларация (описание) только одна.

Скорее всего Вы используете конструкции require или include. Стоит отказаться от них раз у Вас появляется такая ошибка и воспользоваться аналогами require_once и include_once. Так же стоит обратить внимание на __autoload() очень помогает при работе с классами в PHP 5! 
PM MAIL WWW ICQ   Вверх
redlinesoft
Дата 14.7.2006, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 4.8.2005

Репутация: нет
Всего: нет



И правда! Спасибо огромное! =) 
PM MAIL   Вверх
Aliance
Дата 18.7.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



Уничтожение происходит автоматически после того как теряется последняя ссылка на класс.
Код

class Test() {
   function __destruct() {
      echo "Класс уничтожен!";
   }
}

...

$test = new Test();
$test = null;
 
PM MAIL WWW ICQ Skype   Вверх
Drache
Дата 28.7.2006, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 31.3.2006

Репутация: нет
Всего: 3



Цитата

Уничтожение происходит автоматически после того как теряется последняя ссылка на класс.

в каком смысле? По-моему такой метод применяется в яве, а о пхп ничего подобного не слышала. Хотя может просто не вчитывалась .... но не слышала такого все же.
Плюс Ваш пример ничего относительно ссылок не показывает абсолютно.
Если говорить об уничтожении объекта после того как теряется последняя ссылка (причем на объект, а не на класс), то здесь может быть такой пример:
Код

$obj = new myClass();
$obj->myMathod();
echo $obj; // после этого объект уничтожается, т.к. уже не используется, 
                 // это последняя ссылка на него.
$a = 7;
$a++;


но это так, лирическое отступление smile А в пхп объект уничтожается по-моему двумя путями:
1. по окончанию выполнения скрипта.
2. вручную - через unset например, ну т.е. как обычная переменная.

я в чем-то неправа? 
PM MAIL   Вверх
SamDark
Дата 28.7.2006, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: нет
Всего: 38



Drache
Права насчёт 1 и 2. 


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
Mal Hack
Дата 28.7.2006, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Цитата(redlinesoft @  13.7.2006,  19:14 Найти цитируемый пост)
Этот класс имеет две функции, в которых необходимо создать новый экземпляр модуля.

Это - ошибка проектирования. Зачем делать еще один экземпляр класса, если уже один есть? Лишняя память и т.п.

Цитата(Aliance @  18.7.2006,  14:42 Найти цитируемый пост)
Уничтожение происходит автоматически после того как теряется последняя ссылка на класс.

Ты не уничтожаешь объект. Переменная $obj содержит ссылку на объект. Присваивая указателю null ты всего лишь удаляешь ссылку, но сам объект в памяти СКОРЕЕ ВСЕГО ОСТАЕТСЯ (уточнить могут только ребята из zend'a).

При использовании unset должна очищаться и память и удаляться ссылка. 
PM ICQ   Вверх
Endeveit
Дата 29.7.2006, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 2.6.2006

Репутация: нет
Всего: 7



Mal Hack, Aliance дал почти правильный пример. Единственный минус примера в том, что он синтаксически неверно написан: надо не class Test(), а class Test.
Так же из примера видно, что $test- это последнее упоминание о классе Test, после того, как мы обнулили её, пхп автоматически уничтожил объект. Это механизм работы с объектами в 5й версии пхп.
unset в данном случае работает так же как и присваивание переменной, содержащей объект, значения NULL.
Более подробно можно почитать на Zend.com  

Это сообщение отредактировал(а) Endeveit - 29.7.2006, 16:28
PM WWW   Вверх
Mal Hack
Дата 29.7.2006, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Цитата(Endeveit @  29.7.2006,  17:27 Найти цитируемый пост)
Так же из примера видно, что $test- это последнее упоминание о классе Test, после того, как мы обнулили её, пхп автоматически уничтожил объект. Это механизм работы с объектами в 5й версии пхп.
unset в данном случае работает так же как и присваивание переменной, содержащей объект, значения NULL.
Более подробно можно почитать на Zend.com  

Дай линк.
Что-то я тут подумал, и кажется мне что меня проглючивает.
null в сях, к примеру, очищает память, если больше на эту область памяти никто не ссылается. А если ссылкаются, т.е. у нас есть объект и ссылка на него, то будет удалена ссылка того, кудапишем null.
Думаю тут работает также. И посему null не всегда "убъет" память... 
PM ICQ   Вверх
Endeveit
Дата 30.7.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 2.6.2006

Репутация: нет
Всего: 7



Mal Hack, тебя проглючивает smile в данном конкретном случае null в пхп работает так же как и в сях, т.е. так, как ты описал. Т.е. сначала мы в данном примере уничтожаем последнюю ссылку на объект (устанавливая её в null), а пхп автоматически очищает выделенную под объект область памяти. Как таковой сам по себе null не "убивает" память. Оговорюсь ещё раз: я разбирал конкретно пример, данный Aliance.
з.ы. не могу найти точную ссылку, но видел где-то в этом районе. 
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Extensions | Следующая тема »


 




[ Время генерации скрипта: 0.0634 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.