php依赖注入学习记录

<?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();

猜你喜欢

转载自blog.csdn.net/onlyjin/article/details/78626501