php DI容器

php DI容器,php,Php,我没有很多php经验,我需要一些帮助, 我有一个php MVC框架, 我使用这个类: class Registry { private $objects; private $settings; public function __construct() { } public function iniObject($class, $key) { $this->objects[ $key ] = new $class( $thi

我没有很多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() {}
 }
我用

$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容器和其他东西, 我想知道一个更好的方法,如果注册中心 越来越大如何影响框架我是说我通过了 所有的注册到每一个班级,都有一种方法可以通过 每个类都需要的依赖项,而不是完整的注册表, 注册表是处理对象的最佳方式吗 在任何其他类中使用任何类或其他东西这不是一个好方法 方法,关于DI容器库的任何建议, 请告诉我,我想从更有经验的php那里得到一些想法 程序员需要这样做
非常感谢

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

虽然依赖项注入和注册表对象允许您从任何地方访问对象,但我认为区别在于,在依赖项注入中,依赖项对象被实例化,并在实例化时传递到所需对象

这个传入可以通过构造函数或者通过设置所需对象的属性来完成。 主要的一点是,所需的对象及其依赖项是松散耦合的

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


话虽如此,依赖注入并不是所有项目都必须或必须的。例如,一个复杂的依赖项注入框架可能会影响性能或给应用程序带来不必要的复杂性。

您正在注入整个注册表。我建议您直接注入依赖项:

class Foo {
    /**
     * @Inject
     * @var MyLogClass
     */
    private $log;
}
这样,您的代码更易于读写,而且您不必关心您的注册表


这是可能的,例如,它可以与您正在使用的DI容器之类的注释一起使用。

那么,如果您必须使用许多可能需要其他类方法的类,您的建议是什么,我一直在使用symfony DI您是否测试过regardsI是否测试过symfony,但我不喜欢配置样式。我使用的是yadif()的修改版本。话虽如此,如果你觉得symfony与你的应用程序配合得很好,那么它也是一个可行的选择。