1. 云栖社区>
  2. PHP教程>
  3. 正文

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

作者:用户 来源:互联网 时间:2017-12-01 19:24:10

实例代码

PHP依赖倒置(Dependency Injection)代码实例 - 摘要: 本文讲的是PHP依赖倒置(Dependency Injection)代码实例, 实现类:<?php class Container{ protected $setings = array(); public function set($abstract, $concrete = null)

实现类:

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

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索实例 代码 ,以便于您获取更多的相关知识。