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


Posted in PHP onJune 14, 2019

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

先看代码:

<?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程序设计有所帮助。

PHP 相关文章推荐
屏蔽浏览器缓存另类方法
Oct 09 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
Aug 21 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
Dec 22 PHP
php数组分页实现方法
Apr 30 PHP
php 多文件上传的实现实例
Oct 23 PHP
PHP反射机制原理与用法详解
Feb 15 PHP
thinkPHP5.0框架环境变量配置方法
Mar 17 PHP
Laravel学习教程之从入口到输出过程详解
Aug 27 PHP
使用PHP访问RabbitMQ消息队列的方法示例
Jun 06 PHP
PHP使用Redis实现Session共享的实现示例
May 12 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
Oct 12 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 PHP
php反射学习之不用new方法实例化类操作示例
Jun 14 #PHP
PHP反射学习入门示例
Jun 14 #PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
Jun 14 #PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
Jun 14 #PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
Jun 14 #PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
Jun 13 #PHP
PHP面向对象程序设计重载(overloading)操作详解
Jun 13 #PHP
You might like
S900/ ETON E1-XM 收音机
2021/03/02 无线电
set_include_path在win和linux下的区别
2008/01/10 PHP
php中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
又一个PHP实现的冒泡排序算法分享
2014/08/21 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
Javascript 日期处理之时区问题
2009/10/08 Javascript
JavaScript原型继承之基础机制分析
2011/08/26 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
2013/06/14 Javascript
Javascript基础教程之while语句
2015/01/18 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
js中less常用的方法小结
2017/08/09 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
vue随机验证码组件的封装实现
2020/02/19 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
[49:08]Secret vs VP 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
Python解析xml中dom元素的方法
2015/03/12 Python
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
TensorFlow实现MLP多层感知机模型
2018/03/09 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
Tensorflow进行多维矩阵的拆分与拼接实例
2020/02/07 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
自我评价怎么写正确呢?
2013/12/02 职场文书
初中班主任评语
2014/04/24 职场文书
表彰大会策划方案
2014/05/13 职场文书
全陪导游词
2015/02/04 职场文书
Docker下安装Oracle19c
2022/04/13 Servers
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle