php依赖注入容器

依赖注入是为了解决各个类之间相互的依赖关系。依赖注入容器就是存储各个类之间依赖关系的一个容器。

在各个 php 框架中都有用到 php 容器,有的框架依赖注入容器功能非常强大且非常完善,例如:laravel、yii2,这里记录一个简单的依赖注入容器,是 easyswoole 中的一个简单依赖注入容器,具在很好的参考作用,如果这个容器满足不了我们的需求,我们可以在这个基础上进行扩展。

Di.php 如下:

<?php
/**
 * Created by PhpStorm.
 * User: yf
 * Date: 2018/5/24
 * Time: 下午4:17
 */

namespace EasySwoole\Component;


class Di
{
    use Singleton;
    private $container = array();

    public function set($key, $obj,...$arg):void
    {
        /*
         * 注入的时候不做任何的类型检测与转换
         * 由于编程人员为问题,该注入资源并不一定会被用到
         */
        $this->container[$key] = array(
            "obj"=>$obj,
            "params"=>$arg,
        );
    }

    function delete($key):void
    {
        unset( $this->container[$key]);
    }

    function clear():void
    {
        $this->container = array();
    }

    /**
     * @param $key
     * @return null
     * @throws \Throwable
     */
    function get($key)
    {
        if(isset($this->container[$key])){
            $obj = $this->container[$key]['obj'];
            $params = $this->container[$key]['params'];
            if(is_object($obj) || is_callable($obj)){
                return $obj;
            }else if(is_string($obj) && class_exists($obj)){
                try{
                    $this->container[$key]['obj'] = new $obj(...$params);
                    return $this->container[$key]['obj'];
                }catch (\Throwable $throwable){
                    throw $throwable;
                }
            }else{
                return $obj;
            }
        }else{
            return null;
        }
    }
}

说明一下,这个类中引入的 Singleton 是一个实现单例的 trait,可以参考上一篇文章。

发布了48 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_37825371/article/details/104203957