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
Форумы портала PHP.SU :: Версия для печати :: php __destruct (деструктор)
Форумы портала PHP.SU » » Объектно-ориентированное программирование » php __destruct (деструктор)

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

1. DlTA - 17 Июля, 2013 - 10:33:11 - перейти к сообщению
деструкторы в пыхе рабтают? вот есть у меня некий объект, который ассоциируется с некоторыми данными в базе
и есть некий метод 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);
без изменений, объект не занулился
2. caballero - 17 Июля, 2013 - 10:43:16 - перейти к сообщению
он сработает когда сборщик мусора решит удалить обект
в большинстве случаев все объекты разрушаются вместе со страницей
в деструкторах смысла особого нет
3. Мелкий - 17 Июля, 2013 - 10:43:32 - перейти к сообщению
Самоубиваться объекты не умеют.

Чтобы объект убить, всем ссылкам на него надо присвоить что-нибудь другое, например, null.
4. DlTA - 17 Июля, 2013 - 10:45:57 - перейти к сообщению
мда, как то с подвогом
5. Champion - 17 Июля, 2013 - 10:58:48 - перейти к сообщению
caballero пишет:
в деструкторах смысла особого нет
Иногда есть, если объект временными файлами срет. Или еще где-нибудь в неподконтрольном сборщику мусора месте.
6. Мелкий - 17 Июля, 2013 - 11:03:53 - перейти к сообщению
Если объект тяжёлый и очень хочется, можно сделать лёгкий фасад (который пускай себе болтается и будет убит, когда заблагорассудится), а с помощью фабрики и магических методов скрыть использование фасада.

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;
7. DlTA - 17 Июля, 2013 - 11:25:17 - перейти к сообщению
Мелкий пишет:
можно сделать лёгкий фасад (который пускай себе болтается и будет убит, когда заблагорассудится)

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

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

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

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

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

 

Powered by ExBB FM 1.0 RC1