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 多关键字 高亮显示实现代码
Apr 23 PHP
深入PHP内存相关的功能特性详解
Jun 08 PHP
提高PHP性能的编码技巧以及性能优化详细解析
Aug 24 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
Jul 25 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
Jul 21 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
Jul 25 PHP
利用PHP绘图函数实现简单验证码功能的方法
Oct 18 PHP
php事件驱动化设计详解
Nov 10 PHP
详谈php中 strtr 和 str_replace 的效率问题
May 14 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
PHP常用的类封装小结【4个工具类】
Jun 28 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中的PHP_EOL换行符详细解析
2013/10/26 PHP
smarty简单应用实例
2015/11/03 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
PHP实现腾讯与百度坐标转换
2017/08/05 PHP
PHP+ajax实现获取新闻数据简单示例
2018/05/08 PHP
PHP序列化和反序列化深度剖析实例讲解
2020/12/29 PHP
使Ext的Template可以解析二层的json数据的方法
2007/12/22 Javascript
js文件中调用js的实现方法小结
2009/10/23 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
javascript正则表达式总结
2016/02/29 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
JS返回顶部实例代码
2020/08/09 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
[04:16]DOTA2英雄梦之声_第09期_斧王
2014/06/21 DOTA
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
简单的Python抓taobao图片爬虫
2014/10/26 Python
用Python设计一个经典小游戏
2017/05/15 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
CSS3 仿微信聊天小气泡实例代码
2017/04/05 HTML / CSS
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
Orvis官网:自1856年以来,优质服装、飞钓装备等
2018/12/17 全球购物
幼儿园辞职书
2015/02/26 职场文书
初中毕业生自我评价
2015/03/02 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书