Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 不使用依赖项注入容器解析依赖项_Php_Testing_Dependency Injection - Fatal编程技术网

Php 不使用依赖项注入容器解析依赖项

Php 不使用依赖项注入容器解析依赖项,php,testing,dependency-injection,Php,Testing,Dependency Injection,我有一个普通PHP项目,有一个依赖于外部库的类 我不认为在任何地方都将其传递给构造函数是一个好主意(它主要在测试中调用,但包的用户必须将其传递给构造函数) 我没有任何DI容器,也不认为我应该有,因为这个项目是一个小的包,只有几个类 所以我提出了这种方法,想知道这种方法是否有任何后果或缺点,或者是否有其他解决方案 受保护的$client; /** *@param Client | null$Client */ 公共函数构造(客户端$Client=null) { $this->client=$cli

我有一个普通PHP项目,有一个依赖于外部库的类

我不认为在任何地方都将其传递给构造函数是一个好主意(它主要在测试中调用,但包的用户必须将其传递给构造函数)

我没有任何DI容器,也不认为我应该有,因为这个项目是一个小的包,只有几个类

所以我提出了这种方法,想知道这种方法是否有任何后果或缺点,或者是否有其他解决方案

受保护的$client;
/**
*@param Client | null$Client
*/
公共函数构造(客户端$Client=null)
{
$this->client=$client??new client();
}

也许对你有用

protected $client;

public function __construct(Client $client = null)
{
   this->client = isset($client) ?? new Client();
}

也许对你有用

protected $client;

public function __construct(Client $client = null)
{
   this->client = isset($client) ?? new Client();
}

我不认为这有什么大问题。如果没有向类中注入默认的
客户机
实现,那么您的类只会退回到默认的
客户机
实现,但由于您没有强制实现它,因此它保留了适当的灵活性/可测试性

不过,我会更进一步,实施:

更改客户端类以实现它:

class Client implements IClient 
{
  // ...
}
然后将构造函数更改为:

public function __construct(IClient $client = null)
{
  $this->client = $client ?? new Client();
}

这样,您的类甚至根本不依赖于任何实现。如果没有显式地给出一个
客户机,它恰好默认为

我看不出有什么大问题。如果没有向类中注入默认的
客户机
实现,那么您的类只会退回到默认的
客户机
实现,但由于您没有强制实现它,因此它保留了适当的灵活性/可测试性

不过,我会更进一步,实施:

更改客户端类以实现它:

class Client implements IClient 
{
  // ...
}
然后将构造函数更改为:

public function __construct(IClient $client = null)
{
  $this->client = $client ?? new Client();
}
这样,您的类甚至根本不依赖于任何实现。如果没有显式地给它一个,它恰好默认为
Client