当前位置:编程学习 > > 正文

php依赖注入和控制反转的区别(php反射学习之依赖注入示例)

时间:2022-01-25 00:57:42类别:编程学习

php依赖注入和控制反转的区别

php反射学习之依赖注入示例

本文实例讲述了php反射学习之依赖注入。分享给大家供大家参考,具体如下:

先看代码:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • <?php
  • if (PHP_SAPI != 'cli') {
  •   exit('Please run it in terminal!');
  • }
  • if ($argc < 3) {
  •   exit('At least 2 arguments needed!');
  • }
  • $controller = ucfirst($argv[1]) . 'Controller';
  • $action = 'action' . ucfirst($argv[2]);
  • // 检查类是否存在
  • if (!class_exists($controller)) {
  •   exit("Class $controller does not existed!");
  • }
  • // 获取类的反射
  • $reflector = new ReflectionClass($controller);
  • // 检查方法是否存在
  • if (!$reflector->hasMethod($action)) {
  •   exit("Method $action does not existed!");
  • }
  • // 取类的构造函数
  • $constructor = $reflector->getConstructor();
  • // 取构造函数的参数
  • $parameters = $constructor->getParameters();
  • // 遍历参数
  • foreach ($parameters as $key => $parameter) {
  •   // 获取参数声明的类
  •   $injector = new ReflectionClass($parameter->getClass()->name);
  •   // 实例化参数声明类并填入参数列表
  •   $parameters[$key] = $injector->newInstance();
  • }
  • // 使用参数列表实例 controller 类
  • $instance = $reflector->newInstanceArgs($parameters);
  • // 执行
  • $instance->$action();
  • class HelloController
  • {
  •   private $model;
  •   public function __construct(TestModel $model)
  •   {
  •     $this->model = $model;
  •   }
  •   public function actionWorld()
  •   {
  •     echo $this->model->property, PHP_EOL;
  •   }
  • }
  • class TestModel
  • {
  •   public $property = 'property';
  • }
  • (以上代码非原创)将以上代码保存为 run.php

    运行方式,在终端下执行php run.php Hello World

    可以看到,我们要执行 HelloController 下的 WorldAction,
    HelloController 的构造函数需要一个 TestModel类型的对象,

    通过php 反射,我们实现了, TestModel 对象的自动注入,

    上面的例子类似于一个请求分发的过程,是路由请求的分发的一部分,假如我们要接收一个请求 地址例如: /Hello/World

    意思是要执行 HelloController 下的 WorldAction 方法。

    希望本文所述对大家PHP程序设计有所帮助。

    原文链接:https://blog.csdn.net/ltx06/article/details/78933211

    上一篇下一篇

    猜您喜欢

    热门推荐