php的依赖注入

什么是依赖注入?
依赖注入就是不是我自身的,却是我需要的,也是我所依赖的。

class Boy
{
	private $girl;
	
	public function __construct(Girl $girl)
	{
		$this->girl = $girl;
	}
}

class Girl{}

//这里的Boy类就强依赖Girl
$boy = new Boy(new Girl());

//为什么需要依赖注入?  请看没有依赖注入的原始代码:
class Boy
{
	private $girl;
	
	public function __construct()
	{
		$this->girl = new Girl();	
	}
}

$boy = new Boy();

//上面的方式把Girl这个类写死在了代码里,假如现在该男孩又喜欢另一个女孩了该怎么办呢?只有去修改代码,所有这里就体现了依赖注入的好处。我们可以在实例化boy时给它动态的选择女朋友。


//依赖注入的方式:
1:构造器注入:
class Book
{
	private $db;
	
	public function __construct($db)
	{
		$this->db = $db;
	}
}

2:setter注入:
class Book
{
	private $db;
	
	public function setDb($db)
	{
		$this->db = $db;
	}
	
	public function getDb()
	{
		return $this->db;
	}
}

那么这两种注入方法有什么缺点呢?
如果组件中有较多的依赖关系,我们需要创建多个setter方法传递对象或需要在构造器中传入多个对象参数,另外,每次使用组件时都需要创建依赖组件,这样就造成了代码维护不方便。

解决方法?
我们可以提供一个容器,把需要注入的对象都放进这个容器里,用的时候直接从容器中去取即可,其实它就是注册树模式。

总结:
因为大多数应用程序都是由两个或者更多的类通过彼此合作来实现业务逻辑,这使得每个对象都需要获取与其合作的对象(它所依赖的对象)的引用。如果这个获取过程要靠自身实现,那么将导致代码高度耦合并且难以维护和调试。

所以,才有了依赖注入的概念,依赖注入主要解决以下问题:
1:依赖类之间的解耦。
2:单元测试,方便Mock。

上面的代码很清晰,但当我们需要注入很多个依赖时,意味着又要增加很多行,会比较难以管理。比较好的解决办法是建立一个class作为所有依赖关系的容器,在这个class中可以存放、创建、获取、查找需要的依赖关系。

你可能感兴趣的:(PHP)