【问题标题】:Guice like dependency injection frameworks in PHP [duplicate]PHP中的Guice之类的依赖注入框架[重复]
【发布时间】:2012-02-19 10:20:40
【问题描述】:

PHP 中是否有类似 Guice 或类似的依赖注入框架?如果没有,PHP 中有没有好的依赖注入框架?

我必须在 PHP 中实现与在 Java 中实现的代码相同的代码,并且在我的 Java 项目中使用 Guice。所以如果使用类似的框架,PHP版本会更容易实现。

【问题讨论】:

标签: php dependency-injection


【解决方案1】:

(发表我的评论作为回应)

看看我的 Guice 克隆,名为 Sharbat(意思是果汁)。 API 与 Guice 的完全一样。

它几乎有你需要的一切:

  • 构造函数注入(不需要@Inject注解)
  • 字段注入(无论可见性如何,使用@Inject(FooBar))
  • 方法注入(无论可见性如何,都需要@Inject注解)
  • 提供者注入(对于通过@InjectProvider(T=FooBar) 的字段,对于通过@Provider(T=FooBar, param=fooBarProvider) 的方法
  • 范围(可能实现自定义)
  • AOP (方法拦截器)
  • 循环依赖

查看自述文件以了解示例用法。

【讨论】:

  • 来自 Sharbat 的 README.md:“TODO:文档和单元测试”——他们遗漏了一些重要的东西......更不用说最后一次更新是在 04/2012 左右......
【解决方案2】:

我喜欢轻量级的Aura.Di。链接的 github 项目页面中的自述文件为您提供了足够的信息,可以在几分钟内开始使用。但它依赖于 5.3。

如果这是您的主要要求,我认为 Guice 对注释的使用不能在 PHP 运行时实现而不会对性能产生非常严重的影响。

【讨论】:

  • 通过 docblocks 支持注释 - 就像很久以前在 java (xdoclets) 中一样。 Doctrine 确实支持他们 (docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/…)
  • 我想不出一个在运行时使用注释的项目,只是想到了不需要非常快的 docblox。感谢您的示例,但我(天真地,没有数据支持)仍然认为它可能会影响非编译使用的性能。
  • 是的,这就是为什么你应该在生产环境中缓存这些数据。
【解决方案3】:

我想推荐你pimple。它非常易于使用。
关于这个依赖注入容器有一个有趣的presentation(这个演示文稿的作者是 pimple 的创建者)。

【讨论】:

  • fabien 的幻灯片+1
  • 我开始使用 Pimple,因为它似乎是在 PHP 中开始使用 DiC 的好方法......在使用了大约一周后,我得出结论,Pimple 更像是一种服务定位器而不是实际的依赖注入容器,因为您向其注册的每个服务都必须手动连接......
【解决方案4】:

【讨论】:

    【解决方案5】:

    这是另一个要添加到列表中的依赖框架:PHP-DI

    这是一个非常实用的容器,遵循约定优于配置(因此您最终编写的配置比使用其他容器少得多)。

    它通过注解(可选)和最小配置进行依赖注入:

    class Foo {
        /**
         * @Inject
         * @var Bar
         */
        private $bar;
    
        public function hello() {
            return $this->bar->sayHello();
        }
    }
    

    请注意,注释是可选的,如果您不喜欢它,则不必使用它。

    它非常易于使用,并且与 Zend Framework 和 Symfony 很好地集成。

    (免责声明:我确实在这个框架上工作)

    【讨论】:

    【解决方案6】:

    看看

    rg\injektor 是一个复杂的 PHP 依赖注入容器,其灵感来自 Guice。与其他基于反射的容器不同,rg\injektor 包含一个工厂类生成器,您可以使用它来防止在生产环境中使用反射。

    它具有构造函数注入、属性注入、提供程序类、对象管理、命名注入和更多功能。它经过单元测试,可通过 Composer 获得。

    【讨论】:

      【解决方案7】:

      让我介绍一下我对 Guice 克隆的实现。

      雷.迪https://github.com/ray-di/Ray.Di

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 2011-12-09
        • 1970-01-01
        • 2014-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多