欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP依赖倒置(Dependency Injection)代码实例

程序员文章站 2022-04-26 12:11:34
实现类: 复制代码 代码如下:

实现类:

复制代码 代码如下:

<?php
 
class container
{
    protected $setings = array();
 
    public function set($abstract, $concrete = null)
    {
        if ($concrete === null) {
            $concrete = $abstract;
        }
 
        $this->setings[$abstract] = $concrete;
    }
 
    public function get($abstract, $parameters = array())
    {
        if (!isset($this->setings[$abstract])) {
            return null;
        }
 
        return $this->build($this->setings[$abstract], $parameters);
    }
 
    public function build($concrete, $parameters)
    {
        if ($concrete instanceof closure) {
            return $concrete($this, $parameters);
        }
 
        $reflector = new reflectionclass($concrete);
 
        if (!$reflector->isinstantiable()) {
            throw new exception("class {$concrete} is not instantiable");
        }
 
        $constructor = $reflector->getconstructor();
 
        if (is_null($constructor)) {
            return $reflector->newinstance();
        }
 
        $parameters = $constructor->getparameters();
        $dependencies = $this->getdependencies($parameters);
 
        return $reflector->newinstanceargs($dependencies);
    }
 
    public function getdependencies($parameters)
    {
        $dependencies = array();
        foreach ($parameters as $parameter) {
            $dependency = $parameter->getclass();
            if ($dependency === null) {
                if ($parameter->isdefaultvalueavailable()) {
                    $dependencies[] = $parameter->getdefaultvalue();
                } else {
                    throw new exception("can not be resolve class dependency {$parameter->name}");
                }
            } else {
                $dependencies[] = $this->get($dependency->name);
            }
        }
 
        return $dependencies;
    }
}

实现实例:

复制代码 代码如下:

<?php
 
require 'container.php';
 
 
interface myinterface{}
class foo implements myinterface{}
class bar implements myinterface{}
class baz
{
    public function __construct(myinterface $foo)
    {
        $this->foo = $foo;
    }
}
 
$container = new container();
$container->set('baz', 'baz');
$container->set('myinterface', 'foo');
$baz = $container->get('baz');
print_r($baz);
$container->set('myinterface', 'bar');
$baz = $container->get('baz');
print_r($baz);