ThinkPHP3.1迁移到PHP7的注意事项

2018.10.31

3723

小平

ThinkPHP3.1迁移到PHP7的注意事项

最近项目从PHP5.5升级到了PHP7.0,框架是ThinkPHP3.1.3,记录下升级过程。

一、我用的apache服务器,项目里开启了路由功能,所以.htaccess文件就改成了

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L]

/eis',"\$this->restoreLiteral('\\1')",$tmplContent);

替换为

$tmplContent = preg_replace_callback('//is',function($r) {

return$this->restoreLiteral($r[1]);

}, $tmplContent);

NO2. 大约在168行,将

$content = preg_replace('/'.$begin.'literal'.$end.'(.*?)'.$begin.'\/literal'.$end.'/eis',"\$this->parseLiteral('\\1')",$content);

替换为

$content = preg_replace_callback('/'. $begin .'literal'. $end .'(.*?)'. $begin .'\/literal'. $end .'/is',function($r) {

return$this->parseLiteral($r[1]);

}, $content);

NO3. 大约在197行,将

$content = preg_replace('/('.$this->config['tmpl_begin'].')([^\d\s'.$this->config['tmpl_begin'].$this->config['tmpl_end'].'].+?)('.$this->config['tmpl_end'].')/eis',"\$this->parseTag('\\2')",$content);

替换为

$content = preg_replace_callback('/('.$this->config['tmpl_begin'] .')([^\d\s'.$this->config['tmpl_begin'] .$this->config['tmpl_end'] .'].+?)('.$this->config['tmpl_end'] .')/is',function($r) {

return$this->parseTag($r[2]);

}, $content);

NO4. 大约在266行,将

preg_replace('/'.$begin.'block\sname=(.+?)\s*?'.$end.'(.*?)'.$begin.'\/block'.$end.'/eis',"\$this->parseBlock('\\1','\\2')",$content);

替换为

preg_replace_callback('/'. $begin .'block\sname=(.+?)\s*?'. $end .'(.*?)'. $begin .'\/block'. $end .'/is',function($r) {

$this->parseBlock($r[1], $r[2]);

}, $content);

NO5. 大约在271行,将

$content = preg_replace('/'.$begin.'block\sname=(.+?)\s*?'.$end.'(.*?)'.$begin.'\/block'.$end.'/eis',"\$this->replaceBlock('\\1','\\2')",$content);

替换为

$content = preg_replace_callback('/'. $begin .'block\sname=(.+?)\s*?'. $end .'(.*?)'. $begin .'\/block'. $end .'/is',function($r) {

return$this->replaceBlock($r[1], $r[2]);

}, $content);

NO6. 大约在273行,将

$content = preg_replace('/'.$begin.'block\sname=(.+?)\s*?'.$end.'(.*?)'.$begin.'\/block'.$end.'/eis',"stripslashes('\\2')",$content);

替换为

$content = preg_replace_callback('/'. $begin .'block\sname=(.+?)\s*?'. $end .'(.*?)'. $begin .'\/block'. $end .'/is',function($r) {

returnstripslashes($r[2]);

}, $content);

NO7和NO8,这两处是连在一起的 大约在396行,改成如下:

if(!$closeTag){

$patterns       ='/'.$begin.$parseTag.$n1.'\/(\s*?)'.$end.'/is';

$replacement    ="\$this->parseXmlTag('$tagLib','$tag','$1','')";

$content = preg_replace_callback($patterns,function($r)use($tagLib, $tag) {

return$this->parseXmlTag($tagLib, $tag, $r[1],'');

},$content);

}else{

$patterns       ='/'.$begin.$parseTag.$n1.$end.'(.*?)'.$begin.'\/'.$parseTag.'(\s*?)'.$end.'/is';

$replacement    ="\$this->parseXmlTag('$tagLib','$tag','$1','$2')";

for($i=0;$i

$content = preg_replace_callback($patterns,function($r)use($tagLib, $tag) {

return$this->parseXmlTag($tagLib, $tag, $r[1], $r[2]);

},$content);

}

2)ThinkPHP\Lib\Core\Dispatcher.class.php大约132行,将

preg_replace('@(\w+)\/([^\/]+)@e','$var[\'\\1\']=strip_tags(\'\\2\');', implode('/',$paths));

改为

preg_replace_callback('@(\w+)\/([^\/]+)@',function($r)use(&$var){

$var[$r['1']] = strip_tags($r[2]);

},implode('/',$paths));

3)ThinkPHP\Lib\Core\Db.class.php大约605行,将

$joinStr = preg_replace("/__([A-Z_-]+)__/esU",C("DB_PREFIX").".strtolower('$1')",$joinStr);

改为

$DB_PREFIX = C("DB_PREFIX");

$joinStr = preg_replace_callback("/__([A-Z_-]+)__/sU",function($r)use($DB_PREFIX) {

return$DB_PREFIX.".strtolower({$r[1]})";

},$joinStr);

4)ThinkPHP\Lib\Behavior\CheckRouteBehavior.class.php这个文件需要修改的地方共4处NO1. 大约151行,将

$url  =  preg_replace('/:(\d+)/e','$values[\\1-1]',$url);

改为

$url = preg_replace_callback('/:(\d+)/',function($r)use(&$values){

return$values[$r[1]-1];

},$url);

NO2. 大约168行,将

preg_replace('@(\w+)\/([^\/]+)@e','$var[strtolower(\'\\1\')]=strip_tags(\'\\2\');', implode('/',$paths));

改为

preg_replace_callback('@(\w+)\/([^\/]+)@',function($r)use(&$var){

$var[strtolower($r['1'])] = strip_tags($r[2]);

},implode('/',$paths));

NO3. 大约191行,将

$url = preg_replace('/:(\d+)/e','$matches[\\1]',$url);

改为

$url = preg_replace_callback('/:(\d+)/',function($r)use(&$matches) {

return$matches[$r[1]];

},$url);

NO4. 大约201行,将

preg_replace('@(\w+)\/([^,\/]+)@e','$var[strtolower(\'\\1\')]=strip_tags(\'\\2\');', $regx);

改为

preg_replace_callback('@(\w+)\/([^,\/]+)@',function($r)use(&$var){

$var[strtolower($r['1'])] = strip_tags($r[2]);

},$regx);

5)ThinkPHP\Extend\Mode\Lite\Dispatcher.class.php大约65行,将

$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e','$var[\'\\1\']="\\2";', implode($depr,$paths));

改为

preg_replace_callback('@(\w+)'.$depr.'([^'.$depr.'\/]+)@',function($r)use(&$var){

$var[$r['1']] = $r[2];

},implode($depr,$paths));

6)ThinkPHP\Lib\Behavior\ReadHtmlCacheBehavior.class.php大约65行处的一个if判断替换为:

if(!empty($html)) {

// 解读静态规则

$rule   = $html[0];

// 以$_开头的系统变量

//$rule   = preg_replace('/{\$(_\w+)\.(\w+)\|(\w+)}/e',"\\3(\$\\1['\\2'])",$rule);

$rule = preg_replace_callback('/{\$(_\w+)\.(\w+)\|(\w+)}/',function($r){

$system ="$r[3](\${$r[1]}['$r[2]'])";

eval("\$system = $system ;");

return$system;

},$rule);

//$rule   = preg_replace('/{\$(_\w+)\.(\w+)}/e',"\$\\1['\\2']",$rule);

$rule = preg_replace_callback('/{\$(_\w+)\.(\w+)}/',function($r){

$system ="\${$r[1]}['$r[2]']";

eval("\$system = $system ;");

return$system;

},$rule);

// {ID|FUN} GET变量的简写

//$rule   = preg_replace('/{(\w+)\|(\w+)}/e',"\\2(\$_GET['\\1'])",$rule);

$rule = preg_replace_callback('/{(\w+)\|(\w+)}/',function($r){

return$r[2]($_GET[$r[1]]);

},$rule);

//$rule   = preg_replace('/{(\w+)}/e',"\$_GET['\\1']",$rule);

$rule = preg_replace_callback('/{(\w+)}/',function($r){

return$_GET[$r[1]];

},$rule);

// 特殊系统变量

$rule   = str_ireplace(

array('{:app}','{:module}','{:action}','{:group}'),

array(APP_NAME,MODULE_NAME,ACTION_NAME,defined('GROUP_NAME')?GROUP_NAME:''),

$rule);

// {|FUN} 单独使用函数

//$rule  = preg_replace('/{\|(\w+)}/e',"\\1()",$rule);

$rule  = preg_replace_callback('/{\|(\w+)}/',function($r){

return$r[1]();

},$rule);

if(!empty($html[2])) $rule    =   $html[2]($rule);// 应用附加函数

$cacheTime =isset($html[1])?$html[1]:C('HTML_CACHE_TIME');// 缓存有效期

// 当前缓存文件

define('HTML_FILE_NAME',HTML_PATH . $rule.C('HTML_FILE_SUFFIX'));

return$cacheTime;

}

四、如果有用到验证码,请把ThinkPHP\Extend\Library\ORG\Util目录下的String.class.php复制一份放在一起,并改名为Stringnew.class.php

打开Stringnew.class.php

把所有的String::替换为Stringnew::

并把类名Class String 改为 Class Stringnew打开ThinkPHP\Extend\Library\ORG\Util\Image.class.php,把所有的

import('ORG.Util.String');

替换成

import('ORG.Util.Stringnew');

五、自定义函数的参数最好给定默认值,如果自定义函数规定了参数,但是没有指定默认值,在外部调用的时候,如果传参的时候少传值了,那么运行会报错!

这样,在PHP7下就能运行ThinkPHP3.1了。

分享到:

thinkphp3.1迁移php7,ThinkPHP3.1迁移到PHP7的注意事项相关推荐

  1. mysql大表迁移_MySQL 大表迁移

    一.需求分析 线上100G 大表 table1 迁移,从DB1 迁移到DB2. 二.环境要求: 1.MySQL 使用InnoDB 存储引擎,且开启独立表空间: 2.两个库的MySQL版本一致(未做不同 ...

  2. 数据库迁移_【干货分享】DM数据库迁移方法(物理迁移)

    在数据库的维护过程中,可能涉及换服务器,或者需要现网数据库环境测试的情况,这时,最简单快速的办法就是将源数据库相关的文件拷贝到目标主机,然后注册数据库实例服务.这就是数据库的物理迁移过程,可以是从wi ...

  3. 利用迁移助手从Oracle迁移到SQL Server

    在实际的项目中,我们常常需要在不同的数据库之前进行迁移,在以前,这可能是和麻烦的事情,但是现在有很多的好的工具可以快速的帮助我们忙成这个目标. 下面我们从来看看如何从Oracle迁移到SQL Serv ...

  4. 共享文件服务器迁移,服务器共享文件夹迁移

    服务器共享文件夹迁移 内容精选 换一换 SQL Server使用日志传送来进行灾备,即可以自动将主服务器上数据库实例的事务日志发送到辅助服务器上,用于灾备的数据库实例进行还原操作.如图1所示的方案中, ...

  5. KVM 虚拟机在物理主机之间迁移的实现 -- 静态迁移/动态迁移/存储迁移

    原文转自:http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm2/ 静态迁移 静态迁移:也叫做常规迁移.离线迁移(Offline Migrati ...

  6. ecs服务器数据迁移_免费服务器迁移上云实践分享!一键迁云,自动同步

    导读:云服务器ECS(Elastic Computing Service)是每个阿里云用户上云的"第一步". 本次分享将为大家介绍免费的服务器迁移上云最佳实践方案和新功能特性,包括 ...

  7. drupal 迁移_关于如何迁移到Drupal的4个技巧

    drupal 迁移 如果您的网站内容丰富,那么您肯定会听说过Drupal ,这是一个开源内容管理系统(CMS). 也许您还听说过Drupal是免费的,安全的,并且拥有完善的开发人员网络,这意味着有很多 ...

  8. yii 执行指定迁移文件_laravel的迁移文件

    1. 迁移是什么? 迁移就像是对数据库进行的版本控制,让你的团队能够轻松地去定义和共享程序的数据库结构.迁移通常配合 Laravel 的结构生成器,可以轻松生成应用程序的数据库结构.如果团队中有个成员 ...

  9. 服务器项目迁移本地,云服务器迁移本地

    云服务器迁移本地 内容精选 换一换 迁移前,若选择迁移到已有服务器,请做以下准备工作:需配置目的端服务器所在VPC安全组,如果是Windows系统需要开放TCP的8899端口.8900端口和22端口: ...

  10. 网站服务器迁移耗时,网站迁移,整体服务器网站迁移步骤方案

    <网站迁移,整体服务器网站迁移步骤方案>由会员分享,可在线阅读,更多相关<网站迁移,整体服务器网站迁移步骤方案(2页珍藏版)>请在人人文库网上搜索. 1.网站迁移网站迁移,整体 ...

最新文章

  1. automake使用说明
  2. Unknown CMake command add_compile_definitions
  3. 安装软件要求输入服务器配置信息,信息技术考试软件配置安装与操作规范(管理服务端与客户端)(30页)-原创力文档...
  4. java swing窗口放置屏幕中央问题思考
  5. MySQL数据库入门学习
  6. TestStand自定义报表生成-添加列
  7. 做项目的一些思路(针对小白)
  8. 解析身份证号码(附加Java代码)
  9. 动态规划经典入门题(初学必刷)
  10. Android Studio如何连接手机设备
  11. java打印26个大写字母
  12. 什么是“大数据新闻”? 大数据
  13. 安装目录里无法找到计算机,安装软件弹出系统找不到指定的路径提示解决方法...
  14. 战双帕弥什登入显示服务器错误,战双帕弥什无法登陆怎么办 进不了游戏解决方法...
  15. 第20节 应用HSRP协议布署双核心交换机网络——提高网络故障容错率
  16. 知识见解关于高斯定理
  17. android如何设置图标,Android APP如何设置显示图标
  18. 2021-12-07(JZ83 剪绳子(进阶版))
  19. 骑缝章的正确盖法(详细图文教程)
  20. 华为4面技术5面HR,附面试题答案

热门文章

  1. mysql 查询条件
  2. javascript中常用数组方法详细讲解
  3. 如何利用ZBrush中的DynaMesh创建身体(一)
  4. CodeForces - 570E(dp------------- Codeforces Round #316 (Div. 2)E
  5. DHTMLX 前端框架 建立你的一个应用程序教程(二)--设置布局
  6. AQuery学习笔记(一)
  7. 使用UIImageView实现图像拖动、缩放等
  8. vs 本地调试(IIS)
  9. IIS上的web service调用AX服务问题
  10. 阿里云移动端播放器高级功能---安全播放