Просмотр поста

.
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();