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

.
L!MP

reaper, я просто думал что оно несколько иначе работает.

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

return [
    IConnection::class       => Di\Singleton(Connection::class),
    ICache::class            => Di\Singleton(Cache::class),

    IAuthorRepository::class => Di\Transient(UserRepository::class, [
        Di\Link(IConnection::class), Di\Link(ICache::class)
    ]),
];


Которое кешируется в единый класс расширяющий динамический контейнер:

class Container extends Framework\Container
{
    protected $Framework_IConnection;
    protected $Framework_ICache;

    public function getFramework_IConnection() {
        return $this->Framework_IConnection ?: $this->Framework_IConnection = new Espresso\Connection();
    }
    public function getFramework_ICache() {
        return $this->Framework_ICache ?: $this->Framework_ICache = new Espresso\Cache();
    }
    public function getIAuthorRepository() {
        return new UserRepository($this->getFramework_IConnection(), $this->getFramework_ICache());
    }
}


В родительском контейнере что-то типа:
class Container
{
    public function resolve($alias)
    {
        if (method_exists($this, $method = 'get'. str_replace('\\', '_', $alias))) {
            return $this->{$method}();
        } else {
            return $this->dinamicLookup($alias);
        }
    }
}


Такая схема реализацие обеспечивает наименьший оверхед и максимальную скорость работы.

З.Ы: вот если бы ещё и Closure таким образом можно было кешировать из памяти в код. Это наврено надо тянуть какой нибудь PHP Parser или как он там называется, что бы анализировать что там в лямбде за код, ну или вобще от них отказаться в данной реализации.