理解laravel---1.2 控制反轉2

     在php運行時,擴展分析程序,導出或提出關於類、方法、屬性、參數等的詳細信息,包括註釋。這種動態獲取信息以及動態調用方法的功能稱爲反射API.

<?php

/**
 * @author zhuxinlei
 * @date 2020-06-12
 * @desc 我是類A的註釋
 */
class A
{
    //我是構造函數的註釋
    public function __construct(B $b)
    {
        $this->b = $b;
    }
    //我是getB的註釋
    public function getB()
    {
        $this->b->bMethod();
    }
}
class B
{
    public function __construct(C $c,D $d)
    {
        $this->c = $c;
        $this->d = $d;
    }
    public  function bMethod()
    {
        echo "我是B中的方法bMethod()";
    }
}

class C{
    public function __construct(){

    }
    public function cMethod(){
        echo "我是C中的方法cMethod()";
    }

}

class D{
    public function __construct(){

    }
    public function dMethod(){
        echo "我是D中的方法dMethod()";
    }
}

class Ioc
{
    protected $instances = [];
    public function __construct()
    {
    }
    public function getInstance($abstract){
        //獲取類的反射信息,也就是類的所有信息
        $reflector = new ReflectionClass($abstract);
        //  echo $reflector->getDocComment();  獲取類的註釋信息

        //獲取反射類的構造函數信息
        $constructor = $reflector->getConstructor();
        //獲取反射類的構造函數的參數
        $dependencies = $constructor->getParameters();

        if(!$dependencies){
            return new $abstract();
        }
        foreach ($dependencies as $dependency) {

            if(!is_null($dependency->getClass())){
                $p[] = $this->make($dependency->getClass()->name);
                //這裏$p[0]是C的實例化對象,$p[1]是D的實例化對象
            }
        }
        //創建一個類的新實例,給出的參數將傳遞到類的構造函數
        return $reflector->newInstanceArgs($p);
    }


    public function make($abstract)
    {
        return $this->getInstance($abstract);
    }
}

$ioc = new Ioc();
$a = $ioc->make('A');
$a->getB();



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章