您好,欢迎访问一九零五行业门户网

PHP依赖倒置(Dependency Injection)代码实例_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;
    }
}
实现实例:
代码如下:
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);
其它类似信息

推荐信息