<?php
/**
* 依赖注入容器学习
*/
header("Content-Type: text/html;charset=utf-8");
class Bedroom {
public function __construct() {
echo ' 我是卧室 <br />';
}
public function todo() {
echo ' 我有一间卧室 <br /> ';
}
}
/**
* 先有卧室,再有书桌
* 卧室作为构造函数参数传入
*/
class Desk {
private $bedroom;
public function __construct(Bedroom $bedroom) {
$this->bedroom = $bedroom;
echo ' 我是书桌,前提要有卧室 <br /> ';
}
public function todo() {
echo ' 卧室里有一张大大的书桌 <br /> ';
}
}
/**
* 先有书桌,再有书
* 书桌作为构造函数参数传入
*/
class Book {
private $desk;
public function __construct(Desk $desk) {
$this->desk = $desk;
echo ' 我是书,前提要有书桌 <br /> ';
}
public function todo() {
echo ' 书桌上整齐的摆放着我的书 <br /> ';
}
}
/**
* 容器,自动构建类
*/
class Container {
private $result = array();
public function __construct() {
}
public function __set($class_name, $class_obj) {
$this->result[$class_name] = $class_obj;
}
public function __get($class_name) {
return $this->_build($class_name);
}
/**
* @todo 自动构建类
* @param $class_name string 类名称
*/
public function _build($class_name) {
if ($class_name instanceof Closure) {// 匿名函数(即闭包函数)直接执行
return $class_name($this);
} else {
$reflector = new ReflectionClass($class_name);//反射当前对象资源
if ($reflector->isInstantiable()) {//判断当前对象能否实例化
$dependencies = $this->_getDependencies($reflector);
$build = $reflector->newInstanceArgs($dependencies);// Creates a new class instance from given arguments
$this->result[$class_name] = $build;
return $build;
} else {
return NULL;
//不能实例化的对象
}
}
}
/**
* @todo 获取构造函数的依赖类
*/
private function _getDependencies($reflector) {
$constructor = $reflector->getConstructor();//获取改类的构造函数
$dependencies = [];
if ($constructor) {
$params = $constructor->getParameters();
if ($params) {
//若有构造函数,构造函数的参数不为空且为类,则循环递归获取依赖类
foreach ($params as $param) {
//再次判断变量是否是类
$dependency = $param->getClass();//获取依赖变量的类名称
if ($dependency) {
$dependencies[] = $this->_build($param->name);//递归获取
}
}
}
}
return $dependencies;
}
}
$c = new Container();
$book = $c->__get('Book');
echo '<br /> <br />';
$desk = $c->__get('Desk');
echo '<br /> <br />';
$bedroom = $c->__get('BedRoom');
echo '<br /> <br />';
$bedroom->todo();
$desk->todo();
$book->todo();
php依赖注入学习记录
猜你喜欢
转载自blog.csdn.net/onlyjin/article/details/78626501
今日推荐
周排行