php的微核心容器 PHPiocContainer
最近正在搞对象依赖,除了配置文件,还有就是微核心容器 PicoContainer 比较流行?
php5因为参数可以有 Type Hinting 类型指示,照说也可以做
测试了下可行,谁搞过这方面,也拿出来骚一下……
//以下A/B/C 3个类,相互间有依赖,通过构造函数注入
class A{
}
class B {
protected $o;
function __construct(A $o) {
$this->o=$o;
}
}
class C {
protected $o;
protected $oo;
function __construct(B $o,A $oo) {
$this->o=$o;
$this->oo=$oo;
}
}
//测试的微核心容器类。没搞父子容器啥的。通过参数的类型指示/反射,创建对象时自动注入其依赖的其他对象
class PHPiocContainer {
protected $regClassNames=array();
protected $classConstructIocs=array();
//注册类
public function regClass($className) {
$this->regClassNames[]=$className;
}
//返回对象
public function getObject($className) {
return $this->createObject($className);
}
//递归创建对象
protected function createObject($className) {
if(!in_array($className,$this->regClassNames)){
exit('class is not registered');
}
$p=array();
foreach($this->getClassConstructIoc($className) as $hintClass){
if(!empty($hintClass)){
$p[]=$this->createObject($hintClass);
}
}
for ($i = 0; $i < count($p); $i++) {
$newP .= '$p['.$i.'],';
}
$newP = rtrim($newP,',');
return eval("return new $className($newP);");
}
//获得 类构造函数 其所有参数的类型指示
protected function &getClassConstructIoc($className) {
if(!isset($this->classConstructIocs[$className])) {
$this->classConstructIocs[$className]=array();
if(in_array('__construct',get_class_methods($className))){
$mo=new ReflectionMethod ($className,'__construct');
foreach($mo->getParameters() as $parameter){
$po=new ReflectionParameter(array($className,'__construct'),$parameter->name);
$this->classConstructIocs[$className][$parameter->name]=$po->getClass()->name;
}
}
}
return $this->classConstructIocs[$className];
}
}
$PHPiocContainer=new PHPiocContainer;
$PHPiocContainer->regClass('A');//注册的顺序没有关系
$PHPiocContainer->regClass('B');
$PHPiocContainer->regClass('C');
$myC=$PHPiocContainer->getObject('C');
print_r($myC);