如何在旧的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在XP下IIS和Apache2服务器上的安装
Sep 05 PHP
php2html php生成静态页函数
Dec 08 PHP
php面向对象全攻略 (八)重载新的方法
Sep 30 PHP
Mysql中分页查询的两个解决方法比较
May 02 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
Nov 20 PHP
ThinkPHP实现支付宝接口功能实例
Dec 02 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
Mar 18 PHP
php处理复杂xml数据示例
Jul 11 PHP
PHP7新增运算符用法实例分析
Sep 26 PHP
smarty模板数学运算示例
Dec 11 PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
Jun 11 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
Apr 14 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&amp;java(一)
2006/10/09 PHP
php读取大文件示例分享(文件操作类)
2014/04/13 PHP
PHP小技巧之函数重载
2014/06/02 PHP
教你如何解密 “ PHP 神盾解密工具 ”
2014/06/20 PHP
使用vs code编辑调试php配置的方法
2019/01/29 PHP
Laravel框架实现即点即改功能的方法分析
2019/10/31 PHP
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
2013/11/03 Javascript
jQuery在ul中显示某个li索引号的方法
2015/03/17 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
探究react-native 源码的图片缓存问题
2017/08/24 Javascript
微信小程序的日期选择器的实例详解
2017/09/29 Javascript
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
vue 多入口文件搭建 vue多页面搭建的实例讲解
2018/03/12 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
使用grappelli为django admin后台添加模板
2014/11/18 Python
Python标准库sched模块使用指南
2017/07/06 Python
Python实现PS图像调整黑白效果示例
2018/01/25 Python
python操作oracle的完整教程分享
2018/01/30 Python
Python测试人员需要掌握的知识
2018/02/08 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
2018/05/25 Python
详解python中的装饰器
2018/07/10 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
pandas取出重复数据的方法
2019/07/04 Python
python2和python3实现在图片上加汉字的方法
2019/08/22 Python
用HTML5实现手机摇一摇的功能的教程
2012/10/30 HTML / CSS
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
日本语毕业生自荐信
2014/02/01 职场文书
幼儿教师研修感言
2014/02/12 职场文书
销售活动策划方案
2014/08/26 职场文书
房地产销售主管岗位职责
2015/02/13 职场文书
2015年电工工作总结
2015/04/10 职场文书
社区服务理念口号
2015/12/25 职场文书
浅谈redis缓存在项目中的使用
2021/05/20 Redis