如何在旧的PHP系统中使用PHP 5.3之后的库


Posted in PHP onDecember 02, 2015

所谓老的系统,是指没有使用PHP 5.3以上命名空间(namespace)特性编码的系统。

但是,只要你的系统运行在 PHP 5.3及以上的环境,在你的老系统中,是可以使用这些基于新特性如命名空间编码的库或代码的。

以前只是有洁癖不用而已。

比如,我是个工具控,想让所用的禅道系统也像那些国际化开源 Issue 项目一样有一套标准开放的 API - 禅道本身是有套 html、json 自适配模式可以当接口用的,可以用于其他客户端或系统集成。这几天在尝试编写的用于兼容 Redmine REST 风格接口的禅道 PMS API,就有意识的用了这种混合的写法。

由于要兼容 Redmine 的 REST 风格,首先选用了 Slim 这个微服务框架,毫无疑问,它是要求运行环境>5.3的,但我总得复用禅道已有的代码,这样效率才高。

原理很简单,就是一根反斜杠,或者两根。

先用composer 初始化了slim 库。

重点部位的代码:

入口文件 index.php

require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/inc/zentao/nb/Autoloader.php';
\zentao\nb\Autoloader::register();

$app = \zentao\core\Application::app(dirname(ZTNB_ROOT)); //禅道的router

$slim = new \Slim\Slim();

$routes = require __DIR__ . '/data/config/routes.php';

foreach ($routes as $method => $_routes) {
 if ($_routes) {
  foreach ($_routes as $rule => $map) {
   $slim->$method($rule, '\\zentao\\nb\\resource\\' . $map);
  }
 }
}

$slim->run();

\zentao\core\Application 是独立封装的兼容禅道原来运行环境的类,由禅道中的 framework/router.class.php 改造而来,主要用于加载禅道中的相关资源如配置文件、模型等。精华应该在这里面,主要是加了一些“\”来让微服务中能跑起来禅道运来的运行环境,并作为一个命名空间的桥梁可以在新的代码中调用。

再看看资源类的父类 \zentao\nb\Resource,片段

<?php

namespace zentao\nb;

/**
 * 资源类 父类
 */
class Resource {

 public function __construct() {
  
 }

 /**
  * Load the model file of one module.
  * 
  * @param string  $methodName The method name, if empty, use current module's name.
  * @access public
  * @return object|bool If no model file, return false. Else return the model object.
  */
 protected function loadModel($moduleName) {
  $modelFile = \helper::setModelFile($moduleName);

  /* If no model file, try load config. */
  if (!\helper::import($modelFile)) {
   $this->app->loadConfig($moduleName, false);
   $this->app->loadLang($moduleName);
   $this->dao = new dao();
   return false;
  }

  $modelClass = class_exists('ext' . $moduleName . 'model') ? 'ext' . $moduleName . 'model' : $moduleName . 'model';
  $modelClass = '\\' . $modelClass;
  if (!class_exists($modelClass))
   $this->app->triggerError(" The model $modelClass not found", __FILE__, __LINE__, $exit = true);

  $this->$moduleName = new $modelClass();
  $this->dao = $this->$moduleName->dao;
  return $this->$moduleName;
 }

这样可以在资源类中调用禅道的 model 类。

还有另外一种用法,加载语言包:

<?php

namespace zentao\nb\resource;

use zentao\nb\enum\BugType;

/**
 * 项目自行定义的问题分类
 */
class IssueCategory extends \zentao\nb\resource {
 
 public function fetchAll($format = 'json') {
  global $app;

  $types = $app->loadLang('bug')->bug->typeList;
  $issue_categories = array();
  foreach ($types as $key => $name) {
   
   $issue_categories[] = array('id' => BugType::getIdByInterId($key), 'name' => $name);
  }
  
  echo json_encode(array('issue_categories' => $issue_categories));
 }
 
 /**
  * 根据项目来取其中定义的分类
  * @param int $projectId
  * @param string $format
  */
 public function fetchAllByProjectId($projectId, $format = 'json') {
  $model = $this->loadModel('project');
  $project = $model->getById($projectId);//TODO 支持按项目代号查找
  if (!$project) {
   $this->responseNotExixted();
  }
  
  global $app;
  $types = $app->loadLang('bug')->bug->typeList;
  $issue_categories = array();
  foreach ($types as $key => $name) {
   
   $issue_categories[] = array('id' => BugType::getIdByInterId($key), 'project' => array('id' => $projectId, 'name' => $project->name), 'name' => $name);
  }
  
  echo json_encode(array(
   'issue_categories' => $issue_categories,
   'total_count' => 2
  ));
 }
}

基本项目结构如下:

如何在旧的PHP系统中使用PHP 5.3之后的库

项目只是初步成型,尚未完成。

如何在旧的PHP系统中使用PHP 5.3之后的库

这是在 NB 中的任务列表。

如何在旧的PHP系统中使用PHP 5.3之后的库

这是在 NB 中的任务详情。

以上就是告诉大家如何在旧的PHP系统中使用PHP 5.3之后的库,希望对大家的学习有所帮助。

PHP 相关文章推荐
[原创]效率较高的php下读取文本文件的代码
Jul 02 PHP
PHP 存储文本换行实现方法
Jan 05 PHP
由php的call_user_func传reference引发的思考
Jul 23 PHP
PHP抽象类 介绍
Jun 13 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
Jun 20 PHP
高性能PHP框架Symfony2经典入门教程
Jul 08 PHP
浅析php单例模式
Nov 25 PHP
php使用for语句输出三角形的方法
Jun 09 PHP
PHP 根据key 给二维数组分组
Dec 09 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
PHP下载大文件失败并限制下载速度的实例代码
May 10 PHP
thinkphp微信开发(消息加密解密)
Dec 02 #PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
Dec 02 #PHP
PHP接收json 并将接收数据插入数据库的实现代码
Dec 01 #PHP
实例讲解yii2.0在php命令行中运行的步骤
Dec 01 #PHP
PHP简单的MVC框架实现方法
Dec 01 #PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
Dec 01 #PHP
基于php实现七牛抓取远程图片
Dec 01 #PHP
You might like
php登陆页的密码处理方式分享
2013/10/14 PHP
一漂亮的PHP图片验证码实例
2014/03/21 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
js下将金额数字每三位一逗号分隔
2016/02/19 Javascript
jQuery实现淡入淡出的模态框
2017/02/09 Javascript
js中作用域的实例解析
2017/03/16 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
React Native 图片查看组件的方法
2018/03/01 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
Vue实现点击箭头上下移动效果
2020/06/11 Javascript
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
详解django中url路由配置及渲染方式
2019/02/25 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
Python实现的栈、队列、文件目录遍历操作示例
2019/05/06 Python
python中几种自动微分库解析
2019/08/29 Python
Python socket非阻塞模块应用示例
2019/09/12 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
JBL英国官网:JBL UK
2018/07/04 全球购物
美国牛仔品牌:True Religion
2018/11/16 全球购物
旅游管理实习自我鉴定
2013/09/29 职场文书
廉洁自律承诺书
2014/03/27 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
四风对照检查剖析材料
2014/10/07 职场文书
回复函范文
2015/07/14 职场文书
实验室安全管理制度
2015/08/05 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书