工厂模式
<?php
class Factory{
public function make($class){
return new $class();
}
}
?>
这是一个简单工厂模式,其实就是对类的集中实例化,外界要调用的时候只需要传入类名,这里就会返回对应的类。
工厂模式加解析依赖
当一个类传入进来的时候,但是这个类却依赖于其它类。由于工厂模式只能单纯的实例化一个单一的类,不能将依赖也实例化并且注入。所以需要用到解析依赖。而解析依赖基于反射机制。
<?php
class Factory{
public function make($class){
//对传入进来的类进行反射解析
$reflector = new ReflectionClass($class);
//获取解析类的构造函数
$constructor = $reflector->getConstructor();
//如果没有构造函数,直接返回对象
if(is_null($constructor)){
return new $class;
}
//获取构造函数的参数
$dependencies = $constructor->getParameters();
//将参数传给解析依赖函数
$instances = $this->resolveDependencies($dependencies)
//生成新的构造函数,并传入参数
return $reflector->newInstanceArgs($instances)
}
//解析依赖
protected function resolveDependencies($dependencies)
{
$result = [];
//遍历参数
foreach($dependencies as $dependency){
//递归调用make函数,并将参数对应的类名传给make
$result[] = $this->make($dependency->getClass()->name);
}
return $result;
}
}
?>
这就是工厂模式加依赖解析,不用在怕类有依赖了。
依赖解析的流程
class A 依赖于 class B
class A{
public function __construct(B $b)
}
我们现在用工厂实例化A类
make(A);
由于反射机制将A解析,获取到他的构造函数的参数。
由于依赖可能不止一个,况且构造函数的参数是一个数组。所以要循环遍历。
得到参数后用-getClass()->name可以获取到参数对应的类名,也就是B。
再将B交给make函数,make函数通过解析,判断没有构造函数(如果有继续执行解析),直接返回实例。
返回的实例被$result数组接收。等全部参数都循环完。将$result返回。
接收到$result的数组后,生成新的构造函数,将数组作为构造函数的参数。
整个流程就是这样