当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-25 15:58:29 浏览: 评论:0 

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

先看代码:

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

(以上代码非原创)将以上代码保存为 run.php

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

可以看到,我们要执行 HelloController 下的 WorldAction,

HelloController 的构造函数需要一个 TestModel类型的对象,

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

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

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

Tags: php反射 php依赖注入

分享到: