如何在旧的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 相关文章推荐
IIS环境下快速安装、配置和调试PHP5.2.0
Dec 17 PHP
php adodb连接不同数据库
Mar 19 PHP
PHP 文件上传功能实现代码
Jun 24 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
Jul 18 PHP
web目录下不应该存在多余的程序(安全考虑)
May 09 PHP
CI框架装载器Loader.php源码分析
Nov 04 PHP
php中magic_quotes_gpc对unserialize的影响分析
Dec 16 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
Jan 04 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
基于PHP实现数据分页显示功能
May 26 PHP
PHP图形计数器程序显示网站用户浏览量
Jul 20 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
Nov 03 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 daodb插入、更新与删除数据
2009/03/19 PHP
PHP以及MYSQL日期比较方法
2012/11/29 PHP
php将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
注释PHP和html混合代码的小技巧(分享)
2016/11/03 PHP
JQuery 操作select标签实现代码
2010/05/14 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
2014/04/14 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
JS中innerHTML和pasteHTML的区别实例分析
2016/06/22 Javascript
jquery操作ID带有变量的节点实例
2016/12/07 Javascript
JS中with的替代方法与String中的正则方法详解
2016/12/23 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
2016/12/30 Javascript
layui的table单击行勾选checkbox功能方法
2018/08/14 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
npm scripts 使用指南详解
2018/10/08 Javascript
[07:25]DOTA2-DPC中国联赛2月5日Recap集锦
2021/03/11 DOTA
python循环监控远程端口的方法
2015/03/14 Python
Django框架下在视图中使用模版的方法
2015/07/16 Python
Python的pycurl包用法简介
2015/11/13 Python
Python语言实现将图片转化为html页面
2017/12/06 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
python实现四人制扑克牌游戏
2020/04/22 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
恐龙的灭绝教学反思
2014/02/12 职场文书
公司外出活动方案
2014/08/14 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
2015年度企业工作总结
2015/05/21 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python
在 Python 中利用 Pool 进行多线程
2022/04/24 Python
Java Spring Lifecycle的使用
2022/05/06 Java/Android