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

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

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

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

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

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

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

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

Tags: php反射 php依赖注入

分享到: