PHP依赖倒置(Dependency Injection)代码实例
PHP依赖倒置(Dependency Injection)代码实例
发布时间:2016-12-29 来源:查字典编辑
摘要:实现类:复制代码代码如下:setings[$abstract]=$concrete;}publicfunctionget($abstract...

实现类:

复制代码 代码如下:

<?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);

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新php教程学习
热门php教程学习
编程开发子分类