php DI容器

时间:2011-08-21 06:37:10

标签: php

我没有很多PHP经验,我需要一些帮助, 我有一个php MVC框架, 我用这个班:

    class Registry {


private $objects;

private $settings;

    public function __construct() {

    }


    public function iniObject($class, $key)
    {
      $this->objects[ $key ] = new $class( $this );
    }

    public function getObject( $key )
    {

     return $this->objects[ $key ];
    }

    public function storeSetting( $setting, $key )
    {

      $this->settings[ $key ] = $setting;
    }


    public function getSetting( $key )
    {

      return $this->settings[ $key ];
    }
}

然后我将注册表传递给其他类,如:

    Class Controller 
 {

/*
 * @registry object
 */
    protected $registry;

    function __construct(Registry $registry) 
    {

     $this->registry = $registry;
    //i can use any class from my registry class like the logger class  below
     $this->registry->getObject('log')->write_log('debug', "Controller Class Initialized");
    }

/**
 * @all controllers must contain an index method
 */
    public function index() {}
 }

我用

启动我的bootstrap.php
$registry = new Registry();

// Instantiate some classes


$registry->iniObject( 'Utf8', 'utf8');

$registry->iniObject( 'Uri', 'uri');

$registry->iniObject( 'Router', 'router');

i get any method like:


$registry->getObject('router')->_set_routing();

我得到的观点如下:

$registry->getObject('output')->_display('myview');

通过这种方式,我可以使用其他类中的所有类 像DI构造函数一样传递注册表类,效果很好, 很少的代码和快速执行,

我一直在读DI容器和其他东西, 如果注册表获得,我想知道一个更好的方法来做到这一点 越来越大将如何影响框架我的意思是我通过 所有注册表到每个类,有一种方法可以通过 每个类需要的依赖项而不是完整的注册表, 注册表是使用对象的最佳方式cos允许我 在任何其他类中使用任何类,或者你认为这不是一件好事 这样做的方法,关于DI容器库的任何建议, 我想从更有经验的PHP收到想法 程序员这样做 非常感谢

2 个答案:

答案 0 :(得分:1)

虽然我不是专家,但我目前正在我的项目中使用yadif DI框架(https://github.com/beberlei/yadif)。我稍微修改了它以适应我的目的。

虽然依赖注入和注册表对象允许您从任何地方访问对象,但我认为不同之处在于依赖注入时,依赖对象被实例化并在实例化时传递给require对象。

这个传入可以通过构造函数或通过设置require对象的属性来完成。 重点是需求对象及其依赖关系松散耦合。

作为一个简单的例子,假设我有一个依赖于Database类的User类。数据库类会将一些信息返回给User类。但是,如果我正在进行单元测试,我想用自己的输入集测试其上的User类。通过依赖注入,我可以轻松地将自己的模拟对象(输入)注入到用户类中,而无需使用测试数据设置数据库,并依赖于数据库来访问并将数据返回给我们。

话虽如此,依赖注入不是必须或所有项目都需要。例如,复杂的依赖注入框架可能会影响性能或在您的应用程序中引入不必要的复杂性。

答案 1 :(得分:0)

您正在注入整个注册表。我建议你应该直接注入你的依赖:

class Foo {
    /**
     * @Inject
     * @var MyLogClass
     */
    private $log;
}

这样,您的代码更易于阅读和编写,而且您不必关心您的注册表。

这可以使用PHP-DI,例如您正在使用的DI容器等注释。