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编码规范之注释和文件结构说明
Jul 09 PHP
分享8个最佳的代码片段在线测试网站
Jun 29 PHP
PHP实现的连贯操作、链式操作实例
Jul 08 PHP
PHP使用缓存即时输出内容(output buffering)的方法
Aug 03 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
Dec 02 PHP
Yii CDBCriteria常用方法实例小结
Jan 19 PHP
解析 thinkphp 框架中的部分方法
May 07 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
PHP实现微信提现(企业付款到零钱)
Aug 01 PHP
php优化查询foreach代码实例讲解
Mar 24 PHP
php png失真的原因及解决办法
Nov 17 PHP
PHP 时间处理类Carbon
May 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
php常用文件操作函数汇总
2014/11/22 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
2018/11/10 PHP
php经典趣味算法实例代码
2020/01/21 PHP
JavaScript随机排序(随即出牌)
2010/09/17 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
一行代码告别document.getElementById
2012/06/01 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
纯javascript实现图片延时加载方法
2015/08/21 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
Java设计中的Builder模式的介绍
2018/03/22 Javascript
vue组件实现进度条效果
2018/06/06 Javascript
vue.js实现的绑定class操作示例
2018/07/06 Javascript
js实现点赞效果
2020/03/16 Javascript
vue element ui validate 主动触发错误提示操作
2020/09/21 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
[13:39]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第一场
2014/05/26 DOTA
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
python获取程序执行文件路径的方法(推荐)
2018/04/26 Python
pandas.DataFrame.to_json按行转json的方法
2018/06/05 Python
Python实现多线程的两种方式分析
2018/08/29 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
如何用 Python 处理不平衡数据集
2021/01/04 Python
英文版网络工程师求职信
2013/10/28 职场文书
医学实习生自我鉴定
2013/12/12 职场文书
爱岗敬业演讲稿范文
2014/01/14 职场文书
民族团结先进个人材料
2014/02/05 职场文书
慈善晚会策划方案
2014/05/14 职场文书
您对思维方式了解多少?
2019/12/09 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python
zabbix监控mysql的实例方法
2021/06/02 MySQL