如何在旧的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学习教程之第2天
Jun 15 PHP
php获取当前网址url并替换参数或网址的方法
Jun 06 PHP
基于PHP一些十分严重的缺陷详解
Jun 03 PHP
php不使用copy()函数复制文件的方法
Mar 13 PHP
PHPMailer发送邮件
Dec 28 PHP
Yii框架弹出框功能示例
Jan 07 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
thinkPHP5框架设置404、403等http状态页面的方法
Jun 05 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
Sep 28 PHP
深入学习微信网址链接解封的防封原理visit_type
Aug 15 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 PHP
PHP之header函数详解
Mar 02 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
基于xcache的配置与使用详解
2013/06/18 PHP
php针对cookie操作的队列操作类实例
2014/12/10 PHP
yii框架搜索分页modle写法
2016/12/19 PHP
php获取POST数据的三种方法实例详解
2016/12/20 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
2016/07/20 Javascript
jQuery3.0中的buildFragment私有函数详解
2016/08/16 Javascript
jQuery实现的瀑布流加载效果示例
2016/09/13 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
微信小程序实现下载进度条的方法
2017/12/08 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
为Python程序添加图形化界面的教程
2015/04/29 Python
python实现弹窗祝福效果
2019/04/07 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
Python3+Selenium+Chrome实现自动填写WPS表单
2020/02/12 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
2020/05/11 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
python zip()函数的使用示例
2020/09/23 Python
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
程序员机试试题汇总
2012/03/07 面试题
技术负责人任命书
2014/06/05 职场文书
行政助理岗位职责
2015/02/10 职场文书
网络管理员岗位职责
2015/02/12 职场文书
试用期自我评价范文
2015/03/10 职场文书
朝花夕拾读书笔记
2015/06/29 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
go开发alertmanger实现钉钉报警
2021/07/16 Golang
Python3的进程和线程你了解吗
2022/03/16 Python