weixin

IOC 例子

日期: April 14, 2021 作者:网站维护

书上看的代码例子,贴一下内容。
visit.php

<?php
interface Visit
{
    public function go();
}

class Leg implements Visit
{
    public function go()
    {
        echo "wait to Tibet!!!";
    }
}

class Car implements Visit
{
    public function go()
    {
        echo "drive car to Tibet!!!";
    }
}

class Train implements Visit
{
    public function go()
    {
        echo "go to Tibet by train!!!";
    }
}
<?php
include('visit.php');

class Container
{
    protected $bindings = [];

    public function bind($abstract, $concrete = null, $shared = false)
    {
        if (! $concrete instanceof Closure){
            $concrete = $this->getClosure($abstract, $concrete);
        }
        $this->bindings[$abstract] = compact('concrete', 'shared');
        print_r($this->bindings);
    }

    protected function getClosure($abstract, $concrete)
    {
        return function($c) use ($abstract, $concrete)
        {
            $method = ($abstract == $concrete) ? 'build' : 'make';
            return $c->$method($concrete);
        };
    }

    public function make($abstract)
    {
        $concrete = $this->getConcrete($abstract);
        if ($this->isBuildable($concrete, $abstract)) {
            $object = $this->build($concrete);
        } else {
            $object = $this->make($concrete);
        }

        return $object;
    }

    protected function isBuildable($concrete, $abstract)
    {
        return $concrete === $abstract || $concrete instanceof Closure;
    }

    protected function getConcrete($abstract)
    {
        if (! isset($this->bindings[$abstract]))
        {
            return $abstract;
        }
        return $this->bindings[$abstract]['concrete'];
    }

    public function build($concrete)
    {
        if($concrete instanceof Closure){
            return $concrete($this);
        }
        echo "new ";
        var_dump($concrete);
        $reflector = new ReflectionClass($concrete);

        if (!$reflector->isInstantiable()){
            echo $message = "Target [$concrete] is not instantiable.";
        }

        $constructor = $reflector->getConstructor();

        if (is_null($constructor)) {
            return new $concrete;
        }
        $dependencies = $constructor->getParameters();
        $instances = $this->getDependencies($dependencies);
        return $reflector->newInstanceArgs($instances);
    }

    protected function getDependencies($parameters)
    {
        $dependencies = [];
        foreach ($parameters as $parameter) {
            $dependency = $parameter->getClass();
            if(is_null($dependency)){
                $dependencies = NULL;
            } else {
                $dependencies[] = $this->resolveClass($parameter);
            }
        }
        return (array) $dependencies;
    }

    protected function resolveClass(ReflectionParameter $parameter)
    {
        return $this->make($parameter->getClass()->name);
    }
}

class Traveller
{
    protected $trafficTool;

    public function __construct(Visit $trafficTool)
    {
        $this->trafficTool = $trafficTool;
    }

    public function visitTibet(){
        $this->trafficTool->go();
    }
}

$app = new Container();

$app->bind("Visit", "Car");
$app->bind("traveller", "Traveller");
//$car = $app->make("Visit");
$tra = $app->make("traveller");
$tra->visitTibet();

广告内容为平台自动生成