美文网首页
php 之依赖注入和反射关系

php 之依赖注入和反射关系

作者: ysp123 | 来源:发表于2019-05-27 23:18 被阅读0次

学习依赖注入和反射应该弄懂以下几个概念:
依赖倒置原则:程序要依赖于抽象接口,不要依赖于具体实现。
控制反转:遵循依赖倒置原则的一种代码设计方案,依赖的创建 (控制) 由主动变为被动 (反转)。
依赖注入:控制反转的一种具体实现方法。通过参数的方式从外部传入依赖,将依赖的创建由主动变为被动 (实现了控制反转)。
反射:提供能够知道类是如何被定义的,它有什么属性、什么方法、方法都有哪些参数,类文件的路径是什么等很重要的信息。
认识从反射开始:

class boy{
    public $name = "bbb";

    public function   __set($name, $value){
          echo   "设置私有属性".PHP_EOL;
          $this->$name = $value;
    }

    public function  __get($name){
         echo  "获取私有属性".PHP_EOL;
        return $this->$name;
    }
   
    public function  action(){
          echo  "吃饭";
    }
}

//实例化类
$reflect = new ReflectionClass(boy::class);
//获取类属性
$props = $reflect->getProperties();
var_dump($props);
echo PHP_EOL;

// 获取反射实例的构造方法
$constructor = $reflect->getConstructor();
var_dump($constructor);
$prams = $constructor->getParameters();
var_dump($prams);

//获取类方法
$metheds = $reflect->getMethods();
var_dump($metheds);
echo PHP_EOL;

//获取方法参数
$prams = $reflect->getMethod('__set')->getParameters();
var_dump($prams);

以上就是对反射的简单了解。
下面我们看戏容器是什么鬼??
首先回顾下上边讲的概念:程序依赖接口,就是类提供的方法,不依赖方法的实现。将具体的实现接口通过反射,以参数的方式从外部注入到使用类里面。讲解的还不够清楚,直接看代码吧

//主要函数实现
static function make($class){
      $reflect  = new ReflectionClass($class);
      
      //判断能否实列化
      if(!$reflect->isInstantiable()){
              throw new Exception('不能实列化!');
      }
      //判断有没有__constructor魔法函数
      $constructor = $reflect->getConstructor();
      if(is_null($constructor)){
            return new $class();
      }  
       
    //获取参数
    $params = $reflec->getParameters();
    //处理依赖关系
    $dependentis = [];
    foreach($params as $key => $param){
            //获取类
           $className = $param->getClass();
           //获取参数
           $paramName = $param->getName();
           
          if(is_null($className)){
                if($className->isDefaultValueAvailable()){
                        $dependentis[] = dependenci->getDefaultValue();
                }else{
                        throw new Exception($paramName . ' 参数没有默认值');
                  }
          }else{
                  $dependentis[] = self::make($className->getName());
            }
      }
      // 获得构造函数的数组之后就可以实例化了
      return $reflect->newInstanceArgs($dependencies);
}

源代码,欢迎查看指正

相关文章

  • php 之依赖注入和反射关系

    学习依赖注入和反射应该弄懂以下几个概念:依赖倒置原则:程序要依赖于抽象接口,不要依赖于具体实现。控制反转:遵循依赖...

  • PHP 依赖注入容器

    介绍 使用 PHP 的反射类 ReflectionClass,创建容器方便管理依赖注入。 代码 创建 digita...

  • 每日java--Day02:依赖注入和控制反转

    昨天学的反射,今天学习依赖注入。控制反转 IOC:利用了反射机制依赖注入 DI:是 IOC 的一种形式,使类与类之...

  • Android依赖注入之反射

    前言 上一篇介绍了依赖注入中的注解,而且篇末还贴了一段通过反射操作注解的代码,传送门https://www.jia...

  • TP5源码:IOC容器及Facade 深度解析(一)

    知识点目录: 1.单例设计模式 2.注册树模式 3.依赖注入(DI) 4.php反射机制 ...

  • PHP反射机制实现自动依赖注入

    依赖注入又叫控制反转,使用过框架的人应该都不陌生。很多人一看名字就觉得是非常高大上的东西,就对它望而却步,今天抽空...

  • PHP反射机制实现自动依赖注入

    转自 http://blog.csdn.net/qq_20678155/article/details/70158...

  • Golang 反射实现依赖注入

    Golang 反射实现依赖注入 Coding/Golang #Golang #Golang/reflect 依赖注...

  • spring

    依赖注入通常有如下两种:设置注入和构造注入: 构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入 设...

  • 依赖注入

    依赖注入(DI)在PHP中的实现 什么是依赖注入? IOC:英文全称:Inversion of Control,中...

网友评论

      本文标题:php 之依赖注入和反射关系

      本文链接:https://www.haomeiwen.com/subject/xqszzqtx.html