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
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
Mar 28 PHP
坏狼的PHP学习教程之第1天
Jun 15 PHP
php合并数组array_merge函数运算符加号与的区别
Oct 31 PHP
CodeIgniter图像处理类的深入解析
Jun 17 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
May 04 PHP
PHP页面间传递值和保持值的方法
Aug 24 PHP
微信支付PHP SDK ―― 公众号支付代码详解
Sep 13 PHP
php一个文件搞定微信jssdk配置
Dec 12 PHP
PHPUnit测试私有属性和方法功能示例
Jun 12 PHP
PHP explode()函数用法讲解
Feb 15 PHP
php设计模式之单例模式用法经典示例分析
Sep 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 insert语法详解
2008/06/07 PHP
php的curl实现get和post的代码
2008/08/23 PHP
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
2011/11/10 PHP
php 函数中使用static的说明
2012/06/01 PHP
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
textarea 控制输入字符字节数(示例代码)
2013/12/27 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
AngularJS基础知识笔记之过滤器
2015/05/10 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
2015/12/04 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
jQuery的ready方法实现原理分析
2016/10/26 Javascript
微信小程序自定义tab实现多层tab嵌套功能
2018/06/15 Javascript
解决element UI 自定义传参的问题
2018/08/22 Javascript
layui清空,重置表单数据的实例
2019/09/12 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
2020/01/02 Javascript
JS实现图片懒加载(lazyload)过程详解
2020/04/02 Javascript
js实现双人五子棋小游戏
2020/05/28 Javascript
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
在Django的session中使用User对象的方法
2015/07/23 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
2019/05/10 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
简单了解django缓存方式及配置
2019/07/19 Python
让你相见恨晚的十个Python骚操作
2020/11/18 Python
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
销售业务实习自我鉴定
2013/09/23 职场文书
党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
留学推荐信(中英文版)
2015/03/26 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
超市主管竞聘书
2015/09/15 职场文书
2016优秀员工先进事迹材料
2016/02/25 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书
Python爬取科目四考试题库的方法实现
2021/03/30 Python
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS