代码之家  ›  专栏  ›  技术社区  ›  Franck

为PHP对象类型参数提供默认值

  •  3
  • Franck  · 技术社区  · 17 年前

    我在编写一个PHP应用程序时考虑到了可测试性,因此我的类总是在其构造函数中询问它们所依赖的依赖注入模式的“协作对象”。

    因为在PHP中不能给对象类型参数一个默认值,所以我必须在构造函数中这样做。以下代码是我当前使用的方法的一个示例:

    class Engine
    {
        private $loader;
        private $logger;
    
        public function __construct(ResourceLoader $loader = null, Logger $logger = null)
        {
            if ($loader == null) $loader = new DefaultResourceLoader;
            if ($logger == null) $logger = new DefaultLogger;
    
            $this->loader = $loader;
            $this->logger = $logger;
        }
    }
    

    你觉得这个怎么样?我应该改用IoC容器,还是有其他方法给对象类型参数一个默认值?

    2 回复  |  直到 17 年前
        1
  •  2
  •   Max Kosyakov Max Kosyakov    17 年前

    当然,您最好使用IoC/DIP容器来完成这项工作。上面的代码(if语句)增加了类的耦合。客户端类(引擎)不应该关心实现加载器和记录器角色的内容。这是工厂或浸渍容器的工作,以了解这一点。通过在代码中加入一个具体的类名,并将这些类绑定在一起,使代码不那么灵活(敏捷),不那么可重用,因而不太可维护。

        2
  •  0
  •   Victor Bocharsky    11 年前

    你可以用我的小图书馆 ValueResolver 在这种情况下,例如:

    $logger = ValueResolver::resolve($logger, new DefaultLogger);
    

    不要忘记使用名称空间 use LapaLabs\ValueResolver\Resolver\ValueResolver;

    还可以进行类型转换,例如,如果变量的值应为 integer ,因此请使用以下命令:

    $id = ValueResolver::toInteger('6 apples', 1); // returns 6
    $id = ValueResolver::toInteger('There are no apples', 1); // returns 1 (used default value)
    

    检查 docs

    推荐文章