服务定位器,依赖注入(和容器)和控制反转 - php

我已经进行了一段时间的编程,但是对从理论上了解每个概念的含义从来没有兴趣,我可能正在使用各种各样的编程概念,但是却一无所知。

服务定位器:
对我而言,指的是通过减少代码量来加快开发速度的快捷方式记录。一个问题是:定位符可以仅引用名称空间/类,还是可以拥有变量注册表?

这是我对此的理解:

$locator = new ServiceLocator()
$locator->set('app', new System\Application());
$locator->set('db', new System\Pdo());

// Get the objects
$locator->get('db')->connect();
$locator->get('app')->run();

依赖注入(和依赖注入容器):
将对象注入对象内,无论工厂模式如何,都可以更快地访问这些对象。和DI容器?

这是我对此的理解:

$app = new System\Application(System\Config::load());

控制反转:
不了解此设计模式(或了解但不知道我做的是IoC)

那么,从理论上(最好是简单的例子),这些概念分别是什么意思?我是正确的,还是出了什么问题/可以改善吗?

谢谢!

参考方案

我认为您正确理解了服务定位器。

关于依赖关系注入,意味着如果对象具有构造函数和/或属性依赖关系,则将它们从外部注入到对象中,而不是对象自己获取依赖关系

public class MyClass
{
   private $_dep;
   public function __construct($dep=null)
   {
       //$dep has to be injected
       $this->_dep=$dep;                           
   }

   //this is wrong because it couples MyClass to a specific Dependency implementation
   public function __construct()
   {
       $this->_dep=new Dependency();
    }
}
   $dep=new Dependency();
   $obj=new MyClass($dep);

通常,构造函数将抽象(接口)作为参数,在类外部实例化一个具体的实现,然后在创建MyClass的新实例时将其传递给构造函数。

DI容器自动处理依赖项注入。您只需对其进行配置,以使它知道在请求抽象时要返回哪些具体类。容器处理对象创建,通过构造函数和/或属性注入依赖项。根据容器的不同(我不知道php的示例,我只熟悉.net DI容器),您可能还必须注册可以通过以下方式创建的对象的类型
它。

控制反转意味着控制将被反转,而不是依赖于较低级别的类(相关性)实现来实现较高级别的类,因此较低级别的类实现将取决于较高级别的类所需的抽象。

//abstraction defined for the use of higher level class
public interface  IRepository {}

// that's the dependency, the lower level class  
public class XmlRepository implements IRepository {}

//the higher level class
 public class MyClass
 {
     public function __construct(IRepository $repo) {}
  }

当DI容器提供IoC功能时,IoC和DiC可以同时使用。

PHP getallheaders替代 - php

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

php:是否有充分的理由引用所有数组键/索引? - php

我正在遍历别人的代码,他们总是避免转义其数组键。例如:$ row_rsCatalogsItems [名称]代替$ row_rsCatalogsItems ['名称']因此,我不断地对自己接触的所有事物进行微小的更改,以应对这些惰性。但是现在我想知道这样做是否有很多好处。我得到它会在默认为字符串之前检查常量(我在处理常量时会讨厌php中的行为,因为即使未定义,…

php fopen相对路径断开-神秘 - php

我知道“必须进行某些更改”,但是我的代码似乎整夜无故中断。我的服务器目录结构是这样的: / /脚本 /审计 /其他事情我在“脚本”文件夹中有一个脚本(假设它被称为“ /scripts/MyScript.php”),该脚本使用curl收集网页中的数据,并将其日期过的副本保存在“审核”文件夹中。要写入审核文件夹,我使用了 $ fh = fopen(“ ./ au…

标头和包含项之间有什么区别,应在何处使用 - php

我对两个词感到困惑header ("Location:homepage_php");include("homepage.php");我猜想标题是在检查密码过程后使用的,关于include,您可以在任何地方使用它。但是我不确定它们之间的实际区别是什么以及应该使用这两个中的哪个位置。 参考方案 标头将用户转发到新页面,因此…

内置函数的PHP源代码 - php

PHP是用C编写的吗?在哪里可以找到PHP源代码,而无需下载所有源代码? 参考方案 PHP函数是用C编写的-您可以在lxr.php.net中找到可浏览的源代码。例如:http://lxr.php.net/opengrok/xref/PHP_5_3/ext/standard/array.c#1242PS:通常,只需在搜索中键入函数名称即可找到函数定义。使用诸如…