Связь между объектами

master_x

Pitavale XXI wieku
Связь между объектами

У меня существует N количество объектов, все они подгружаются и инициализируются внутри конструктора ядра:
PHP:
class Core
{
    var $Config;
    var $MsgBuffer;
    
    function Core($base_path, $arr_instants=array())
    {
        ...
        if(!empty($arr_instants))
        {
            foreach($arr_instants as $var_name=>$component)
            {
                ($GLOBALS[$var_name]=new $component($this->Config[$component])) or 
                    _fatal_error('Unable to instantiate '.$component.' component, shutting down!', 'CORE');
            }
        }
    }
    
    ...
}
Проблема в том, что мне надо обеспечить связь между всеми загруженными объектами в виде буфера сообщений. Т.е. к примеру внутри себя объект A может записать что-нибудь в буфер, а объект B должен тоже иметь в своем распоряжении содержимое этого буфера. Думал об агрегации тоже. Думал о связях типа actor-server-agent... Придумал четыре кривых варианта:
1) через глобальную переменную (ха-ха)
2) через передачу ссылки на объект MsgBuffer в конструктор вот здесь
PHP:
$this->MsgBuffer=new MsgBuffer();
($GLOBALS[$var_name]=new $component($this->Config[$component], &$this->MsgBuffer)) or 
                    _fatal_error('Unable to instantiate '.$component.' component, shutting down!', 'CORE');
3) через функцию
PHP:
function MsgBuffer()
{
static $Buffer;
...
}
4) вот так:
PHP:
$this->MsgBuffer='в отличии от пред. примера это у нас будет не объект а просто строка-буфер';
($GLOBALS[$var_name]=new $component($this->Config[$component])) or 
                    _fatal_error('Unable to instantiate '.$component.' component, shutting down!', 'CORE');
$GLOBALS[$var_name]->MsgBuffer=&this->MsgBuffer;
Понятно, что вариантом 4 можно организовать буфер между всеми объектами... но вот как-то коряво...В общем как лучше?
 

[DAN]

Старожил PHPClub
я бы курил Singletone и Registry.
Соответственно, доступ к сообщениям через вызовы стат. методов класса Registry.
 

master_x

Pitavale XXI wieku
[DAN]
синглтон- это конечно же будет самым правильным решением... однако вот еще одно (дополнение варианта 3):
PHP:
function &msg_buffer()
{
    static $buffer;
    return $buffer;
}
соответственно внутри любого класса:
PHP:
class Hello 
{
    var $Errors;
    function Hello()
    {        
        /*остатки синглтона*/
        /*$this->Errors=MsgBuffer::instance();
        $this->Errors->Msgs[]='hello';  */
        $this->Errors=& msg_buffer(); 
        $this->Errors[]='hello';   
    }
}
неправильно с точки зрения ООП, приятно для глаза, правильно с точки зрения архитектуры приложения. Вот теперь остается выбирать.
 

[DAN]

Старожил PHPClub
>неправильно с точки зрения ООП
А Registry тебе на что?
PHP:
class Registry
{
	function instance() {}
	function getError($errno) {}
	function getErrors() {}
	function putError($errno, $message) {}
	function putErrors($errors) {}
}

class Hallo
{
	var	$errors;

	function Hallo()
	{
		$this->errors = Registry::getErrors();
		Registry::putError('hallo_errno', 'hallo_errmsg')
	}
}
 

master_x

Pitavale XXI wieku
[DAN]
а что ты здесь имел в виду? я в приведенном тобой коде не вижу вызова instance() в классе Hallo, или ты вызываешь его в getError(), getErrors(), putError()..?
 

[DAN]

Старожил PHPClub
master_x, именно. В каждом статическом методе Registry вызываем его же статический instance(), который и возвращает нам Singletone.
Далее работаем с полученным объектом.
 
Сверху