如何在旧的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 09 PHP
使用 php4 加速 web 传输
Oct 09 PHP
PHP 函数语法介绍一
Jun 14 PHP
PHP 设计模式之观察者模式介绍
Feb 22 PHP
PHP命名空间(namespace)的使用基础及示例
Aug 18 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
ThinkPHP框架设计及扩展详解
Nov 25 PHP
php程序员应具有的7种能力小结
Nov 27 PHP
JSON两种结构之对象和数组的理解
Jul 19 PHP
php封装的验证码工具类完整实例
Oct 19 PHP
PHP封装的多文件上传类实例与用法详解
Feb 07 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
Sep 28 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
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
php过滤敏感词的示例
2014/03/31 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
PHP+Ajax实时自动检测是否联网的方法
2015/07/01 PHP
基于Laravel5.4实现多字段登录功能方法示例
2017/08/11 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
Jquery之Bind方法参数传递与接收的三种方法
2014/06/24 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
使用jsonp完美解决跨域问题
2014/11/27 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
如何在Angular2中使用jQuery及其插件的方法
2017/02/09 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
简化版的vue-router实现思路详解
2018/10/19 Javascript
实现Vue的markdown文档可以在线运行的方法示例
2018/12/11 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
2019/04/17 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
Python切片知识解析
2016/03/06 Python
Python3实现并发检验代理池地址的方法
2016/09/18 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
Python3爬虫之自动查询天气并实现语音播报
2019/02/21 Python
容易被忽略的Python内置类型
2020/09/03 Python
如何使用Pytorch搭建模型
2020/10/26 Python
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
MYSQL基础面试题
2012/05/13 面试题
会计职业生涯规划书
2014/01/13 职场文书
教师求职自荐书
2014/06/14 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
车辆转让协议书
2014/09/24 职场文书
2014年终个人总结报告
2015/03/09 职场文书
以下牛机,你有几个
2022/04/05 无线电
Android存储中最基本的文件存储方式
2022/04/30 Java/Android