DI软件构造函数或获取/设置 - 最佳实践

时间:2016-06-24 18:32:30

标签: php oop dependency-injection

我目前正在创建自己的依赖注入软件,但我发现它看起来很像这样做,为此得到这个(如果这是有道理的)。

class FactoryDatabase extends PDO
{
    public function __construct(
        $dsn,$user,$pass
    ) {
        parent::__construct($dsn,$user,$pass);
    }
}

class DependencyInjectionContainer
{
    protected $Con;
    public function __construct(
        $db_factory
    ) {
        $this->Con = $db_factory;
    }
}

$container = new DependencyInjectionContainer(new FactoryDatabase(....

我不完全了解在何处使用构造函数以及在何处使用set / get方法,因为实现此目的的可能性太多。

为了更好的练习,我想了解它是否更好地使用这些构造函数或方法:

protected $Callbacks;
public function set(
    $foo,$bar
) {
    if(!empty($this->Callbacks[$foo]))    {
        $this->Callbacks[$foo] = $bar;
    }
}

$container = new DependencyInjectionContainer();
$container->set('db', new FactoryDatabase(......

但现在我遇到一个问题,即创建get方法将允许直接访问数据库对象,而不是仅通过DI容器对象。

我想过使用构造函数和get / set方法:

public function __construct(
    FactoryDatabase $db
) {
    $this->Con = $db;
}

public function getFunction(
    $foo
) {
    return $this->Callbacks[$foo]($this);
}

public function getValue(
    $foo
) {
    return $this->Callbacks[$foo];
}

这允许我将Callbacks用作值或匿名函数,但也可以访问函数内部的方法,如:

$container->set('db_select_members', function($obj){
    return $obj->....
});

这是最佳做法吗?或者我如何改进这个DI软件以允许完全动态保持对象不清楚其他对象。

唯一的问题是现在可以通过匿名函数直接访问刚才可以访问的对象:

$container->Object

所以这似乎是浪费时间?

1 个答案:

答案 0 :(得分:-2)

在大多数时候,最好的方法是使用经过测试和准备使用的库,如symfony di(http://symfony.com/doc/current/components/dependency_injection/introduction.html

如果您真的需要编写自己的最佳用途,那就是使用像

这样的get-ers创建类

https://justpaste.it/vlpm

并仅使用容器替代工厂