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 相关文章推荐
一段防盗连的PHP代码
Dec 06 PHP
关于页面优化和伪静态
Oct 11 PHP
php中批量修改文件后缀名的函数代码
Oct 23 PHP
PHP版网站缓存加快打开速度的方法分享
Jun 03 PHP
php 操作调试的方法
Jul 12 PHP
PHP curl 获取响应的状态码的方法
Jan 13 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
Mar 30 PHP
thinkPHP分组后模板无法加载问题解决方法
Jul 12 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
Nov 03 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
Jun 15 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
Apr 24 PHP
swoole锁的机制代码实例讲解
Mar 04 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
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
Yii框架上传图片用法总结
2016/03/28 PHP
Yaf框架封装的MySQL数据库操作示例
2019/03/06 PHP
PHP实现的AES 128位加密算法示例
2019/09/16 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
jQuery表单域选择器用法分析
2015/02/10 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
微信小程序学习笔记之跳转页面、传递参数获得数据操作图文详解
2019/03/28 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
Vue父组件如何获取子组件中的变量
2019/07/24 Javascript
Python栈类实例分析
2015/06/15 Python
Python过滤列表用法实例分析
2016/04/29 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
django manage.py扩展自定义命令方法
2018/05/27 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
Django 删除upload_to文件的步骤
2020/03/30 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
2020/05/15 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
2020/05/20 Python
adidas官方旗舰店:德国运动用品制造商
2017/11/25 全球购物
通信工程毕业生自荐信
2013/11/01 职场文书
初中女生自我鉴定
2013/12/19 职场文书
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
劳动竞赛口号
2014/06/16 职场文书
平安工地汇报材料
2014/08/19 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
Windows中Redis安装配置流程并实现远程访问功能
2021/06/07 Redis
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL