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 相关文章推荐
dede3.1分页文字采集过滤规则详说(图文教程)
Apr 03 PHP
php实现首页链接查询 友情链接检查的代码
Jan 05 PHP
php 广告调用类代码(支持Flash调用)
Aug 11 PHP
php中日期加减法运算实现代码
Dec 08 PHP
CodeIgniter启用缓存和清除缓存的方法
Jun 12 PHP
php输入流php://input使用浅析
Sep 02 PHP
PHP中类的自动加载的方法
Mar 17 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
May 29 PHP
PHP容器类的两种实现方式示例
Jul 24 PHP
在TP5数据库中四个字段实现无限分类的示例
Oct 18 PHP
php 使用 __call实现重载功能示例
Nov 18 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编程网上资源导航
2006/10/09 PHP
fleaphp下不确定的多条件查询的巧妙解决方法
2008/09/11 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
PHP中余数、取余的妙用
2015/06/29 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
TNC vs BOOM BO3 第三场2.13
2021/03/10 DOTA
JQuery 前台切换网站的样式实现
2009/06/22 Javascript
javascript prototype原型操作笔记
2009/12/07 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
2013/11/20 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
JS经典正则表达式笔试题汇总
2016/12/15 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
Vue.js中组件中的slot实例详解
2017/07/17 Javascript
React 组件转 Vue 组件的命令写法
2018/02/28 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
微信小程序开发的基本流程步骤
2019/01/31 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
使用css3绘制出各种几何图形
2016/08/17 HTML / CSS
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
中专毕业个人的自荐信格式
2013/09/21 职场文书
小摄影师教学反思
2014/04/27 职场文书
竞选学委演讲稿
2014/09/13 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
离婚协议书格式范本
2016/03/18 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书