Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: php __destruct (деструктор)

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
DlTA
Отправлено: 17 Июля, 2013 - 10:33:11
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




деструкторы в пыхе рабтают? вот есть у меня некий объект, который ассоциируется с некоторыми данными в базе
и есть некий метод remove() публичный,
в который вложено удаление соответствующей строчки из базы, и попутно хотелось бы удалить сам объект, во избежании путаницы
PHP:
скопировать код в буфер обмена
  1. public function remove(){
  2.   // ... работа с базой
  3.  $this->__destruct(); // так достаточно
  4.  return null; // или еще это надо?
  5. }

(Добавление)
PHP:
скопировать код в буфер обмена
  1.         var_dump($ob);
  2.         $ob->remove();
  3.         var_dump($ob);
без изменений, объект не занулился
 
 Top
caballero
Отправлено: 17 Июля, 2013 - 10:43:16
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




он сработает когда сборщик мусора решит удалить обект
в большинстве случаев все объекты разрушаются вместе со страницей
в деструкторах смысла особого нет

(Отредактировано автором: 17 Июля, 2013 - 10:44:33)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Мелкий Супермодератор
Отправлено: 17 Июля, 2013 - 10:43:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Самоубиваться объекты не умеют.

Чтобы объект убить, всем ссылкам на него надо присвоить что-нибудь другое, например, null.


-----
PostgreSQL DBA
 
 Top
DlTA
Отправлено: 17 Июля, 2013 - 10:45:57
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




мда, как то с подвогом
 
 Top
Champion Супермодератор
Отправлено: 17 Июля, 2013 - 10:58:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




caballero пишет:
в деструкторах смысла особого нет
Иногда есть, если объект временными файлами срет. Или еще где-нибудь в неподконтрольном сборщику мусора месте.
 
 Top
Мелкий Супермодератор
Отправлено: 17 Июля, 2013 - 11:03:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Если объект тяжёлый и очень хочется, можно сделать лёгкий фасад (который пускай себе болтается и будет убит, когда заблагорассудится), а с помощью фабрики и магических методов скрыть использование фасада.

PHP:
скопировать код в буфер обмена
  1. class foo {
  2.         public static function factory() {
  3.                 return new facade_foo();
  4.                 }
  5.         public function __destruct() {
  6.                 echo __METHOD__,PHP_EOL;
  7.                 }
  8.  
  9.         public function somemethod($arg1, $arg2) {
  10.                 echo __METHOD__,'("',$arg1,'","', $arg2,'")',PHP_EOL;
  11.                 }
  12.         }
  13.  
  14. class facade_foo {
  15.         private $rObject = null;
  16.         public function __construct() {
  17.                 $this->rObject = new foo();
  18.                 }
  19.         public function remove() {
  20.                 $this->rObject = null;
  21.                 }
  22.  
  23.         public function __call($sMethod, $rgArgs) {
  24.                 assert('!is_null($this->rObject)');
  25.                 call_user_func_array(array($this->rObject, $sMethod), $rgArgs);
  26.                 }
  27.         public function __destruct() {
  28.                 echo __METHOD__,PHP_EOL;
  29.                 }
  30.         }
  31.  
  32. $free = null;
  33. $r = foo::factory();
  34. $free = memory_get_usage();
  35. $r->somemethod('f','d');
  36. $r->remove();
  37. echo "after remove",PHP_EOL;


-----
PostgreSQL DBA
 
 Top
DlTA
Отправлено: 17 Июля, 2013 - 11:25:17
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




Мелкий пишет:
можно сделать лёгкий фасад (который пускай себе болтается и будет убит, когда заблагорассудится)

ммммм, дык вот как юзают фасады

в общем можно и так, это даже позволит избежать фатальных ошибок если случайно будет попытка вызвать методы не существующего объекта.
 
 Top
Мелкий Супермодератор
Отправлено: 17 Июля, 2013 - 11:40:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




DlTA пишет:
ммммм, дык вот как юзают фасады

На самом деле я не уверен в верном именовании.

И точно, мой пример правильнее характеризуется названием Proxy.
http://ru.wikipedia.org/wiki/Proxy_(шаблон_проектирования)

Фасад всё же должен быть заметен, он вводится, чтобы скрыть сложность оригинальной структуры классов за своим простым API. А proxy именно маскируется, чтобы походить на скрываемый класс.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB