理解laravel---1.3 控制反轉3

一段和標準略有不同的寫法,有助於大家更好的理解Ioc容器的概念!

<?php
class A
{
    protected $iocaaa;
    public function __construct(Ioc $ioc)
    {
        $this->iocaaa = $ioc;
    }

    public function getB()
    {
        return $this->iocaaa->make('b')->abc();
    }
}
class B
{
    protected $c;
    public function __construct(C $c)
    {
        $this->c = $c;
    }
    public  function abc()
    {
        echo 'test';
    }
}

class c{
    public function __construct()
    {
    }
}
class Ioc
{
    protected $instances = [];
    public function __construct()
    {
    }

    public function getInstance($abstract){
        $reflector = new ReflectionClass($abstract);
        $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);
            }
        }
        return $reflector->newInstanceArgs($p);
    }

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

echo '<pre>';
$ioc = new Ioc();
$a = $ioc->make('A');
$b = $a->getB();

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