Потестируем destroyable объекты в PHP4?

  • Автор темы Benvolio
  • Дата начала

Benvolio

Guest
Потестируем destroyable объекты в PHP4?

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

Мне недавно пришлось писать класс-брокер для работы с транзакционной БД и реализующий свою некоторую транзакционную логику. И всвязи с этим мне потребовалось чтобы при destroy объекта брокера вызывался деструктор, откатывающий все незавершенные транзакции и после этого громко ругался на разработчика.

Писать пришлось для PHP4. У меня работает на PHP 4.2.2. конечно как всегда писалось для себя, но если вы взглянете на код и на тест и выскажете свои комменты, буду признателен.

Вот как выглядит тест:
PHP:
<?php

/*
+--------------------------------------+
| Test for Destroyable objects         |
| Copyright 2005 Eugene Jerusalimov    |
| mailto: eugene аt jerusalimov dоt ru |
| http://jerusalimov.ru/eugene/        |
+--------------------------------------+
*/

error_reporting(E_ALL);

require_once('AbstractDestroyable.class.php');


$OBJ_NUM = 0;

class TestDestroyable extends AbstractDestroyable {
	var $obj_num;
	
	function TestDestroyable() {
		global $OBJ_NUM;
		
		parent::AbstractDestroyable();

		$this->obj_num = ++$OBJ_NUM;

		echo "Object #".$this->obj_num." created.<br>";
	}

	function _DESTROY() {
		$this = &$this->__get_real_this();
		
		echo "Object #".$this->obj_num." destroyed.<br>";
		
		parent::_DESTROY();
	}
}


echo "Current PHP version: ".phpversion()."<br>";
echo "Let's play!<br>";

## Unfortunately, this object can't be destroyed by unset.
## You can guess why, looking the code of the Abstract.
## $obj =& new TestDestroyable();
## unset($obj);


$obj_arr = array();
for($i=0; $i<5; $i++) {
	$obj_arr[$i] =& new TestDestroyable();
}

## Unnecessary, but impressive
die("Kill 'em all!<br>");

?>
И вот его результат:
Current PHP version: 4.2.2
Let's play!
Object #1 created.
Object #2 created.
Object #3 created.
Object #4 created.
Object #5 created.
Kill 'em all!
Object #1 destroyed.
Object #2 destroyed.
Object #3 destroyed.
Object #4 destroyed.
Object #5 destroyed.

Код абстракта лежит по адресу http://jerusalimov.ru/eugene/codes/PHP/Destroyable_Objects/

Буду благодарен за ваши суждения и комментарии.
 

tony2001

TeaM PHPClub
а в чем вопрос?
в тестировании 4.2.2 ?
кого сейчас интересует 4.2.2 ? никого.
 

Benvolio

Guest
4.2.2 < PHP < 5.0

На 4-ке еще много проектов делается.. По крайней мере как мне кажется полгода точно еще будут разработки на 4-ке.

Сейчас я делаю проект в котором требуется destroy объектов. Надо сделать так, чтобы в дальнейшем (через полгода) перевести проект с минимальными затратами на PHP5.

Вопрос в том, целесообразна ли эта конструкция, может быть где подводные камни, или где-то можно оптимизировать.
 

Benvolio

Guest
:)

Имется ввиду 4.2.2 и выше.. Обычно совместимость рассматривается от более младшей к более старшей версии, так ведь? Также тестировал на 4.3.10 (на рабочей машине). Просто на сайте, где мне это удалось выложить стоит 4.2.2.
 

Benvolio

Guest
Да там хомяк мой, не боле.. А вот рабочие машинки на ПХП5 переведут точно не завтра..
 

SiMM

Новичок
> Код абстракта лежит по адресу
Звучит как издевательство. Впрочем, подозреваю, что parent::AbstractDestroyable(); сводится к [m]register_shutdown_function[/m] - соответственно, объяснения такому поведению читать в мане на эту функцию.
 

Crazy

Developer
SiMM, да ты шаман! :)

Код:
function_AbstractDestroyable()_{
    $this->__register_object();
    register_shutdown_function(array(&$this,'_DESTROY'));
}
Я глючу -- или блеск этой гениальной мысли наблюдался на форуме уже едва ли не полдесятка раз?
 

Screjet

Новичок
Crazy
Врядли.. Все сходится, автор продемострировал свои собственные деструкторы именно на конец работы скрипта. Похоже автор вообще не догадывается о назначении деструкторов.
..Так что все нормально = идем ко дну :)
 

Benvolio

Guest
если бы смысл был бы только в этом конструкторе, я думаю, что не стоило бы вообще это выность на суд общественности, так ведь?

-~{}~ 05.04.05 01:15:

Автор догадывается о назначении деструкторов, и автору безумно интересно узнать как эта задача реализована другими уважаемыми членами форума. И суть поста здесь в другом.

Если есть конструктивные комментарии, отличные от "о, автор прочитал в мане, что есть register_shutdown_function и решил показать это миру" - буду благодарен.

Есть жесткие рамки - PHP4. И нужен механизм дестроя объектов хотя бы по окончанию работы скрипта.

Спасибо.

-~{}~ 05.04.05 01:31:

Кстати, господа, если у кого есть мысль, как сделать полноценный деструктор на ПХП4, например по unsetу или при выходе из зоны видимости - буду очень благодарен.
 

tony2001

TeaM PHPClub
деструкторы aka register_shutdown_function() были изначально в PEAR.
ничего нового или подлежащего тестированию здесь нет.

>как сделать полноценный деструктор на ПХП4,
как найти кошку в темной комнате, если её там нет?
 

Benvolio

Guest
ну на нет - и суда нет.

у админа в хозяйстве кластер из фронтендов с PHP4, на нем крутится куча старых проектов написанных под 4-ю версию. При попытке запустить их на 5-й версии - естесственно вылезает куча ошибок из-за несовместимости. Было принято решение не переделывать старые проекты и сделать новый в том же server-space, но с учетом дальнейшего перехода на PHP5 (когда на это будет время).
 

Screjet

Новичок
вылезает куча ошибок из-за несовместимости
Эта куча должна быть совсем небольшой.
Все таки лучше подпатчить эту "кучу" на предмет совместимости с ПХП5 и новые проекты двигать уже в линейке ПХП5 (Когда переходил на ПХП5 = так и делал).
Это самое простое и эффективное решение.
 

Crazy

Developer
Benvolio, будь проще. Во-первых, ты сделал не деструкторы. В чем легко убедиться, положив объект в $_SESSION.

Во-вторых, для решения твоей задачи деструкторы не нужны вообще. Ты реализовал систему так, чтобы "при destroy объекта брокера вызывался деструктор, откатывающий все незавершенные транзакции". Забудем про деструкторы. Открывая транзакцию, будем регистрировать ее компенсатор. Т.е. класс, умеющий транзакцию откатывать. Это, кстати, ответ на вопрос "как эта задача реализована другими уважаемыми членами форума".
 

Benvolio

Guest
согласен.. сессии вылетели у меня из поля зрения за их неиспользованием в текущем проекте.

разумно, черт побери! :)
благодарю!

-~{}~ 05.04.05 10:19:

кстати, как совмещались сессии и запуск класса компенсатора?

-~{}~ 05.04.05 10:47:

при ближайшем рассмотрении компенсатор оказывается узкоспециализированным деструктором, ведь необходимо, чтобы компенсатор оперировал с данными брокера, закрывал откатывал транзакции именно на нужном mysql линке, писал именно в нужные логи.
с теми же самыми проблемами (unset, $_SESSION, local scope)

или чтобы быть более точным прошу кусок кода.
 

Crazy

Developer
Еще раз: компенсатор не имеет вообще никакого отношения к деструкторам, поскольку его задача -- откат изменений во внешних данных.
 

Benvolio

Guest
ок, понятно..

спасибо всем участникам обсуждения.

тема закрыта.
 
Сверху