如何在旧的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 Class 文章
Apr 04 PHP
PHP 日,周,月点击排行统计
Jan 11 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
Mar 11 PHP
分享一个php 的异常处理程序
Jun 22 PHP
PHP文件缓存类示例分享
Jan 30 PHP
搭建基于Docker的PHP开发环境的详细教程
Jul 01 PHP
PHP如何实现Unicode和Utf-8编码相互转换
Jul 29 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
Jan 19 PHP
php插入mysql数据返回id的方法
May 31 PHP
PHP Cli 模式设置进程名称的方法
Jun 12 PHP
Yii框架通过请求组件处理get,post请求的方法分析
Sep 03 PHP
使用Laravel中的查询构造器实现增删改查功能
Sep 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
无线电的诞生过程
2021/03/01 无线电
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
php中socket通信机制实例详解
2015/01/03 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
JavaScript Date对象使用总结
2009/05/14 Javascript
JavaScript 比较时间大小的代码
2010/04/24 Javascript
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
Bootstrap3下拉菜单的实现
2017/02/22 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
JavaScript实现百度搜索框效果
2020/03/26 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
浅析Vue实例以及生命周期
2018/08/14 Javascript
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
React手稿之 React-Saga的详解
2018/11/12 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
django1.11.1 models 数据库同步方法
2018/05/30 Python
python样条插值的实现代码
2018/12/17 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
django中嵌套的try-except实例
2020/05/21 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
怎样声明子类
2013/07/02 面试题
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
运动会入场解说词300字
2014/01/25 职场文书
艺术设计专业毕业生推荐信
2014/07/08 职场文书
业务员辞职信范文
2015/03/02 职场文书
浅谈golang 中time.After释放的问题
2021/05/05 Golang
Python带你从浅入深探究Tuple(基础篇)
2021/05/15 Python
pytorch 预训练模型读取修改相关参数的填坑问题
2021/06/05 Python
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android