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和ACCESS写聊天室(五)
Oct 09 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
Jul 10 PHP
PHP URL路由类实例
Nov 12 PHP
sae使用smarty模板的方法
Dec 17 PHP
ThinkPHP后台首页index使用frameset时的注意事项分析
Aug 22 PHP
php学习笔记之面向对象
Nov 08 PHP
php操作xml入门之xml基本介绍及xml标签元素
Jan 23 PHP
PHP遍历XML文档所有节点的方法
Mar 12 PHP
php简单实现快速排序的方法
Apr 04 PHP
php结合web uploader插件实现分片上传文件
May 10 PHP
PHP正则表达式入门教程(推荐)
May 18 PHP
PHP中遍历数组的三种常用方法实例分析
Jun 24 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
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
PHP比较运算符的详细介绍
2015/09/29 PHP
详解YII关联查询
2016/01/10 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
javascript 学习之旅 (1)
2009/02/05 Javascript
jQuery中的bind绑定事件与文本框改变事件的临时解决方法
2010/08/13 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
2013/04/02 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
javascript解析json实例详解
2014/11/05 Javascript
javascript实现密码强度显示
2015/03/18 Javascript
微信小程序 前端源码逻辑和工作流详解
2016/10/08 Javascript
JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome
2017/01/05 Javascript
jQuery实现上下滚动公告栏详细代码
2018/11/21 jQuery
echarts实现词云自定义形状的示例代码
2019/02/20 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
JavaScript 作用域实例分析
2019/10/02 Javascript
微信小程序 自定义弹窗实现过程(附代码)
2019/12/05 Javascript
javascript将16进制的字符串转换为10进制整数hex
2020/03/05 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
Python入门篇之正则表达式
2014/10/20 Python
python相似模块用例
2016/03/04 Python
神经网络理论基础及Python实现详解
2017/12/15 Python
python清除字符串前后空格函数的方法
2018/10/21 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
2019/04/15 Python
Python 实现输入任意多个数,并计算其平均值的例子
2019/07/16 Python
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
美国校服网上商店:French Toast
2019/10/08 全球购物
什么是触发器(trigger)? 触发器有什么作用?
2013/09/18 面试题
介绍一些UNIX常用简单命令
2014/11/11 面试题
雷锋之歌观后感
2015/06/10 职场文书
《大禹治水》教学反思
2016/02/22 职场文书