容器是为了解决对象实例化与依赖问题
而发明的.
有了容器Container
我们就可以将任何PHP对象实例塞入容器中,在使用时可以通过容器自动完成对象的实例化和依赖注入.
//一个非容器写法就是
class Url {
public function __construct(Route $route,Valide $valide)
{
......
}
}
$url = new Url(new Route(),new Valide());
//容器的写法
$url = $container->make('url',['route','valide']);
//这样使用就好了,Container自动完成对象的依赖入驻和实例化,当然这个前提是你已经将三个类绑定入容器中,一般是这样
$container->bind('route',function($container){
return new Route();
});
容器顾名思义真的就是一个容器,关键是它是一个管理"类"的容器. 那为什么要整这么一个东西呢?
因为类和类之间会存在依赖,每个类在使用的时候必须实例化才可以使用,而容器的便捷在于它可以"自动依赖注入"和"自动实例化".
也就是如果使用了容器,将自动实例化类对象并将依赖的类自动完成注入,是不是一下子就非常简单了.
举个栗子: 我们要查询某用户的顶顶那,那么就有一个订单类对象实例且依赖用户类对象实例
$order = Container::getInstance()->make(UserOrder::class);
这样就直接返回了用户订单实例对象,容器内部自动完成User::class的依赖注入,并完成UserOrder对象实例化
这里有个概念依赖注入,它指将一个对象作为参数传递给另一个对象,这样的好处是将对象间的耦合关系,从内部转化成了外部,降低了耦合性,提升灵活性.
其他的依赖注入,比如数据库对象/缓存对象等等,它们都可以随时切换类型,但并不需要对依赖他们的类重构代码,这里有个需要注意依赖的目标最好是接口或父类.
这里面也体现了解耦在项目中的设计思想;
解耦的核心思想就是 "尽量"减少组件之间的"直接"联系,使得组件可以"独立"升级修改替换,而不会影响系统的其他方面