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 相关文章推荐
Win2003服务器安全加固设置--进一步提高服务器安全性
May 23 PHP
php与XML、XSLT、Mysql的结合运用实现代码
Nov 19 PHP
php学习笔记(三)操作符与控制结构
Aug 06 PHP
php过滤XSS攻击的函数
Nov 12 PHP
PHP读取RSS(Feed)简单实例
Jun 12 PHP
Thinkphp框架开发移动端接口(2)
Aug 18 PHP
注释PHP和html混合代码的小技巧(分享)
Nov 03 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
Apr 09 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
Nov 03 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
Sep 03 PHP
php+redis实现消息队列功能示例
Sep 19 PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 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/02/28 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
JavaScript 学习笔记(九)call和apply方法
2010/01/11 Javascript
javascript运行机制之this详细介绍
2014/02/07 Javascript
JS回调函数的应用简单实例
2014/09/17 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
jquery插件NProgress.js制作网页加载进度条
2015/06/05 Javascript
7个去伪存真的JavaScript面试题
2016/01/07 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
js实现input密码框显示/隐藏功能
2020/09/10 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
Vue $attrs &amp; inheritAttr实现button禁用效果案例
2020/12/07 Vue.js
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
jupyter使用自动补全和切换默认浏览器的方法
2020/11/18 Python
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
Java的接口和C++的虚类的相同和不同处
2014/03/27 面试题
区域销售经理岗位职责
2013/12/10 职场文书
党员志愿者活动总结
2014/06/26 职场文书
2014市府办领导班子“四风问题”对照检查材料思想汇报
2014/09/24 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
2015年学校管理工作总结
2015/07/20 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书
python process模块的使用简介
2021/05/14 Python
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
javascript对象3个属性特征
2021/11/17 Javascript