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 相关文章推荐
在PWS上安装PHP4.0正式版
Oct 09 PHP
PHP中的Memcache详解
Apr 05 PHP
PHP小技巧之函数重载
Jun 02 PHP
php实现的DateDiff和DateAdd时间函数代码分享
Aug 16 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
Mar 24 PHP
thinkPHP5.0框架安装教程
Mar 25 PHP
PHP 序列化和反序列化函数实例详解
Jul 18 PHP
laravel 5.3中自定义加密服务的方案详解
May 09 PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 PHP
thinkPHP中U方法加密传递参数功能示例
May 29 PHP
如何在PHP中使用数组
Jun 09 PHP
PHP实现限制域名访问的实现代码(本地验证)
Sep 13 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
PHP下几种删除目录的方法总结
2007/08/19 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
2014/08/05 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
PHP中如何防止外部恶意提交调用ajax接口
2016/04/11 PHP
详解Laravel视图间共享数据与视图Composer
2016/08/04 PHP
如何优雅的使用 laravel 的 validator验证方法
2018/11/11 PHP
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
javascript ie6兼容position:fixed实现思路
2013/04/01 Javascript
仿百度的关键词匹配搜索示例
2013/09/25 Javascript
防止jQuery ajax Load使用缓存的方法小结
2014/02/22 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
2016/06/30 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
关于Vue组件库开发详析
2018/07/01 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
2019/07/11 jQuery
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
详解基于Wepy开发小程序插件(推荐)
2019/08/01 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
2020/03/06 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
2020/03/09 Javascript
Python中下划线的使用方法
2015/03/27 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
python中判断文件结束符的具体方法
2020/08/04 Python
浅谈移动端网页图片预加载方案
2018/11/05 HTML / CSS
美国内衣第一品牌:Hanes(恒适)
2016/07/29 全球购物
Amcal中文官网:澳洲综合性连锁药房
2019/03/28 全球购物
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
会展策划与管理专业大学生职业生涯规划
2014/02/07 职场文书
技能比武方案
2014/05/21 职场文书
2014国庆节餐厅促销活动策划方案
2014/09/16 职场文书
2015年综治宣传月活动总结
2015/03/25 职场文书
小学大队干部竞选稿
2015/11/20 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书