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 模板高级篇总结
Dec 21 PHP
php面向对象全攻略 (十) final static const关键字的使用
Sep 30 PHP
使用array mutisort 实现按某字段对数据排序
Jun 18 PHP
file_get_contents(&quot;php://input&quot;, &quot;r&quot;)实例介绍
Jul 01 PHP
php检测iis环境是否支持htaccess的方法
Feb 18 PHP
yii2.0之GridView自定义按钮和链接用法
Dec 15 PHP
用PHP代码在网页上生成图片
Jul 01 PHP
PHP面试常用算法(推荐)
Jul 22 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
Jul 31 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
Oct 11 PHP
漂亮的thinkphp 跳转页封装示例
Oct 16 PHP
PHP变量的作用范围实例讲解
Dec 22 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
10条PHP编程习惯助你找工作
2008/09/29 PHP
PHP游戏编程25个脚本代码
2011/02/08 PHP
php中用foreach来操作数组的代码
2011/07/17 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
php用户注册信息验证正则表达式
2015/11/12 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
js 事件小结 表格区别
2007/08/13 Javascript
基于jquery的回到页面顶部按钮
2011/06/27 Javascript
js Dialog 实践分享
2012/10/22 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
window.location.href IE下跳转失效的解决方法
2014/03/27 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
JS脚本加载后执行相应回调函数的操作方法
2018/02/28 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
[06:09]辉夜杯主赛事开幕式
2015/12/25 DOTA
Django 生成登陆验证码代码分享
2017/12/12 Python
Python使用matplotlib实现绘制自定义图形功能示例
2018/01/18 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
C#里面如何判断一个Object是否是某种类型(如Boolean)?
2016/02/10 面试题
英语专业毕业生自我鉴定
2013/11/09 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
毕业生就业推荐表自我鉴定
2014/03/20 职场文书
中学生评语大全
2014/04/18 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python
《杜鹃的婚约》OP主题曲「凸凹」无字幕影像公开
2022/04/08 日漫
Golang jwt身份认证
2022/04/20 Golang