为什么Service Locator不利于测试是否仍然可以模拟对象? - php

众所周知,使用服务定位器的代码很难测试,而应该使用依赖注入。

但是为什么服务定位器很难测试,如果我们仍然可以轻松地模拟每个对象呢?

考虑这个例子(用PHP编写,但是可以是任何语言)

// method we want to test that has a dependency 
public myFunction() {
    $someDependency = Registry::getService('Dependency');

    // do something with the dependendcy
    $someDependency->doSomething();

    return true;
}

如果要测试此代码,我们可以简单地模拟对象“ Dependency”,例如:

 function testMyFunction() {
        $mock = \Mockery::mock('Dependency');
        $mock->shouldReceive('doSomething')->once();

        Registry::set('Dependency', $mock); // set the double

        $workerObject = new MyClass;
        $this->assertTrue( $workerObject->myFunction() );
 }

该代码是否可测试?为什么在这种情况下Service Locator不好?

请注意,我们都知道Service定位器有多糟糕,因为它隐藏了依赖关系和紫罗兰色SOLID原理。但是在这种情况下,我只是指测试方面。

参考方案

众所周知,使用服务定位器的代码很难测试,而应该使用依赖注入。

我不知道

Service Locator is an anti-pattern的原因不是因为它使代码难以测试(不是),而是因为它使得难以维护。

Service Locator破坏了封装,因为您可以在代码中的任何地方使用它,并且客户端没有机会仔细阅读所有可能使用它的代码,就无法检测到它。

依赖注入是更好的选择,因为它solves the same problems with fewer disadvantages。

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

PHP:将字符串拆分为字母和数字部分的最佳方法 - php

我有几个格式的字符串AA11 AAAAAA1111111 AA1111111 分离字符串的字母和数字部分的最佳方法(最有效)? 参考方案 如果它们都是一系列字母,然后是一系列数字,并且没有非字母数字字符,那么sscanf()可能比regexp更有效$example = 'AAA11111'; list($alpha,$numeric) =…

php-casperjs获取内部文本 - php

我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…

PHP:检查目录是否为空的最佳和最简便的方法是什么 - php

Improve this question 我有一个包含数百个动态生成文件夹的根目录。随着时间的流逝,在这些目录必须为空的情况下,需要从系统中删除其中一些文件夹。实现这一目标的最佳的最短,最简单和/或最有效的方法是什么? 参考方案 使用glob:if (count(glob("path/*")) === 0 ) { // empty gl…

PHP:从函数返回值并直接回显它? - php

这可能是一个愚蠢的问题,但是……的PHPfunction get_info() { $something = "test"; return $something; } html<div class="test"><?php echo get_info(); ?></div> 有没有办…