前言:
说这个话题之前先讲一个比较高端的思想--'依赖倒置原则'
"依赖倒置是一种软件设计思想,在传统软件中,上层代码依赖于下层代码,当下层代码有所改动时,上层代码也要相应进行改动,因此维护成本较高。而依赖倒置原则的思想是,上层不应该依赖下层,应依赖接口。意为上层代码定义接口,下层代码实现该接口,从而使得下层依赖于上层接口,降低耦合度,提高系统弹性",
我对DI(依赖注入)的观点一向是,与其说依赖注入,不如说是依赖管理,其实有些类似于composer、pip、maven这种更高一层管理应用与库之间的依赖工具,DI框架会带来这些好处(前提是好的DI框架)
栗子:
class Human
{
public function eat()
{
echo "eat";
}
}
class Man
{
protected $human;
/**
* 依赖注入
* Man constructor.
* @param $human
*/
public function __construct($human)
{
$this->human = $human;
}
public function sex()
{
$this->human->eat();
echo "man";
}
}
/**
* 容器
* Class Container
*/
class Container
{
static $class = [];
public static function bind($className, Closure $closure)
{
self::$class[$className] = $closure;
}
public static function make($className)
{
$closure = self::$class[$className];
return $closure();
}
}
Container::bind('human', function () {
return new Human();
});
Container::bind("man", function () {
$human = Container::make('human');
return new Man($human);
});
$man = Container::make("man");
$man->sex();
后话
上述只是简单的栗子,在生产阶段不建议使用上述代码