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 и линк на книжку хорошую
Отметить как прочитанное
моя любимая страница на джоне