如何在旧的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初学者(入门学习经验谈)
Oct 12 PHP
php获取post中的json数据的实现方法
Jun 08 PHP
php中取得文件的后缀名?
Feb 20 PHP
phpmyadmin3 安装配置图解教程
Mar 29 PHP
php递归创建和删除文件夹的代码小结
Apr 13 PHP
体育彩票排列三组选三算法分享
Mar 07 PHP
PHP调用MySQL存储过程并返回值的方法
Dec 26 PHP
php对文件进行hash运算的方法
Apr 03 PHP
php脚本运行时的超时机制详解
Feb 17 PHP
php实现用户注册密码的crypt加密
Jun 08 PHP
php实现socket推送技术的示例
Dec 20 PHP
解决laravel查询构造器中的别名问题
Oct 17 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/09/09 PHP
PHP高级对象构建 工厂模式的使用
2012/02/05 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
iOS+PHP注册登录系统 PHP部分(上)
2016/12/26 PHP
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
关于firefox的ElementTraversal 接口 使用说明
2010/11/11 Javascript
ajax异步刷新实现更新数据库
2012/12/03 Javascript
js中array的sort()方法使用介绍
2014/02/20 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
2014/04/08 Javascript
node.js中的fs.statSync方法使用说明
2014/12/16 Javascript
Nodejs如何搭建Web服务器
2016/03/28 NodeJs
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
2016/09/03 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
python实现远程通过网络邮件控制计算机重启或关机
2018/02/22 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
用python建立两个Y轴的XY曲线图方法
2019/07/08 Python
Python中itertools的用法详解
2020/02/07 Python
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
北大青鸟学生求职信
2013/09/24 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
公司财务流程之主管工作流程
2014/03/03 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
2015个人年度工作总结范文
2015/05/28 职场文书
心理健康教育培训研修感言
2015/11/18 职场文书
python基础之//、/与%的区别详解
2022/06/10 Python
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers