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实现文件上传二法
Oct 09 PHP
PHP中路径问题的解决方案
Oct 09 PHP
用PHP+java实现自动新闻滚动窗口
Oct 09 PHP
谈谈新手如何学习PHP
Dec 14 PHP
《PHP编程最快明白》第七讲:php图片验证码与缩略图
Nov 01 PHP
使用PHP获取汉字的拼音(全部与首字母)
Jun 27 PHP
php中读写文件与读写数据库的效率比较分享
Oct 19 PHP
Javascript与PHP验证用户输入URL地址是否正确
Oct 09 PHP
PHP之sprintf函数用法详解
Nov 12 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
Jul 14 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
Nov 09 PHP
PHP数据源架构模式之表入口模式实例分析
Jan 23 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
php字符串截取问题
2006/11/28 PHP
php中的三元运算符使用说明
2011/07/03 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
yii操作session实例简介
2014/07/31 PHP
PHP实现对站点内容外部链接的过滤方法
2014/09/10 PHP
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
AngularJs html compiler详解及示例代码
2016/09/01 Javascript
基于jquery实现二级联动效果
2017/03/30 jQuery
javascript实现简单搜索功能
2020/03/26 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
Vue绑定用户接口实现代码示例
2020/11/04 Javascript
[03:17]2016完美“圣”典风云人物:冷冷专访
2016/12/08 DOTA
python3.3教程之模拟百度登陆代码分享
2014/01/16 Python
python获取从命令行输入数字的方法
2015/04/29 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
对python中list的五种查找方法说明
2020/07/13 Python
纯css3无js实现的Android Logo(有简单动画)
2013/01/21 HTML / CSS
使用CSS3美化HTML表单的技巧演示
2016/05/17 HTML / CSS
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
我有一个梦想演讲稿
2014/05/05 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
项目备案申请报告
2015/05/15 职场文书
python b站视频下载的五种版本
2021/05/27 Python
Nginx反向代理学习实例教程
2021/10/24 Servers
python中mongodb包操作数据库
2022/04/19 Python