我目前正在创建自己的依赖注入软件,但我发现它看起来很像这样做,为此得到这个(如果这是有道理的)。
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
所以这似乎是浪费时间?
答案 0 :(得分:-2)
在大多数时候,最好的方法是使用经过测试和准备使用的库,如symfony di(http://symfony.com/doc/current/components/dependency_injection/introduction.html)
如果您真的需要编写自己的最佳用途,那就是使用像
这样的get-ers创建类等
并仅使用容器替代工厂