Нудистика - или то о чем все знают, но не хотят учитывать

913
.
L!MP, представляю как все модули будут испещерены этим Registry:: :-)
в таком случае я лучше буду запихивать объекты в конструкторы
а для контроллеров родителя сделать следующим образом
abstract class Controller {
    
    protected $registry;
    
    public abstract function index();
    
    public function __construct($registry)
    {
        
        $this->registry = $registry;
        
    }
    
    public function __set($name, $val)
    {
        
        $this->registry->$name = $val;
        
    }
    
    public function __get($name)
    {
        
        return $this->registry->$name;
        
    }
    
}
.
Ну нормально. Только зачем теперь Registry вобще?
.
L!MP, в принципе да можно и в главный контроль все ассигнуть.гг башка уже что то не варит.
.
А вобще, можно как то так:

Контейнер:

class IoC
{
	protected $instances;
	protected $factories;
	
	/**
	* Регистрация объекта в контейнере.
	*
	* @access public
	* @param string $id Идентификатор объекта в контейнере.
	* @param closure|object $resolver Замыкание или объект.
	* @param boolean $reused Использовать повторно.
	* @return void
	*/
	
	function register($id, $resolver, $reused = false)
	{
		if ($resolver instanceof \Closure) {
			$this->factories[ $id ] = compact('resolver', 'reused');
		} else {
			$this->instances[ $id ] = $resolver;
		}
	}
	
	/**
	* Проверяет есть ли объект в контейнере.
	*
	* @access public
	* @param string $id Идентификатор объекта в контейнере.
	* @return boolean
	*/
	
	function is_registered($id)
	{
		return (isset($this->instances[ $id ]) || isset($this->factories[ $id ]));
	}
	
	/**
	* Удаляет объект из контейнера.
	*
	* @access public
	* @param string $id Идентификатор объекта в контейнере.
	* @return void
	*/
	
	function unregister($id)
	{
		unset($this->instances[ $id ], $this->factories[ $id ]);
	}
	
	/**
	* Получение объекта из контейнера.
	*
	* @access public
	* @param string $id Идентификатор объекта в контейнере.
	* @param string|array $arguments Параметры инициализации объекта.
	* @return object
	*/
	
	function resolve($id, $arguments = array())
	{
		if (isset( $this->instances[ $id ])) {
			return $this->instances[ $id ];
		}
		
		$arguments = is_array($arguments) ? $arguments : array($arguments);
		$instance  = call_user_func_array($this->factories[ $id ]['resolver'], $arguments);
		
		if ($this->factories[ $id ]['reused']) {
			return $this->instances[ $id ] = $instance;
		}
		
		return $instance;
	}
}


Пару классов, для демонтсрации:

class DB {
	function __construct()
	{
		//...
	}
	
	function test()
	{
		echo __CLASS__;
	}
}

class Session {
	protected $db;
	
	function __construct($db)
	{
		$this->db = $db;
	}
	
	function test()
	{
		echo $this->db->test();
	}
}


И как это работает:

$container = new IoC;

// регистрируем обьект работы с БД
$container->register('db', new DB);
// регистрируем обьект работы с сессиями
$container->register('session', function() use ($container) {
	return new Session($container->resolve('db'));
}, true);

// получаем обьект класса Session (обьект класса DB уже в нём)
$container->resolve('session')->test();
.
L!MP, спасибо огромное, взял на заметку
.
Подскажите где можно подробно и с примерами почитать о ООП, а то с ваших постов с примерами классов нихрена не понял
.
~XeOn~, В этой теме глянь.
Там есть линки на статьи, вчастности на agiledev.ru и линк на книжку хорошую
.
Отметить как прочитанное
моя любимая страница на джоне
Всего: 38