如何在旧的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+AJAX传送中文会导致乱码的问题的解决方法
Sep 08 PHP
php将会员数据导入到ucenter的代码
Jul 18 PHP
PHP开发者常犯的10个MySQL错误更正剖析
Jan 30 PHP
PHP数据过滤的方法
Oct 30 PHP
新浪SAE云平台下使用codeigniter的数据库配置
Jun 12 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
Mar 17 PHP
Yii2如何批量添加数据
May 17 PHP
PHP session会话操作技巧小结
Sep 27 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
Feb 23 PHP
CakePHP框架Model关联对象用法分析
Aug 04 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
如何用PHP websocket实现网页实时聊天
May 26 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 用数组降低程序的时间复杂度
2009/12/04 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
JavaScript设计模式之抽象工厂模式介绍
2014/12/28 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
AngularJS入门教程之ng-class 指令用法
2016/08/01 Javascript
JavaScript使用键盘输入控制实现数字验证功能
2016/08/19 Javascript
jQuery层次选择器用法示例
2016/09/09 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
js实现直播点击飘心效果
2020/08/19 Javascript
基于javascript实现放大镜特效
2020/12/03 Javascript
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
2019/07/18 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
Keras模型转成tensorflow的.pb操作
2020/07/06 Python
如何用Django处理gzip数据流
2021/01/29 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
写自荐信有哪些不宜?
2013/10/17 职场文书
社区活动邀请函范文
2014/01/29 职场文书
电大毕业自我鉴定
2014/02/03 职场文书
上班玩游戏检讨书
2014/02/07 职场文书
大学新闻系求职信
2014/06/03 职场文书
青年教师师德演讲稿
2014/08/26 职场文书
创业计划书之宠物店
2019/09/19 职场文书