ThinkPHP3.1在PHP7下页面空白的解决方案  
浏览:2057 发布日期:2016/06/28 分类:技术分享
先把BUG原因扔出来:模板解析出了问题。

之前一直用PHP5.6做开发,听说过PHP出7了,不过一直没尝试。直到前两天,处理(大于2038年 || 小于1900年)时间戳,发现mktime()返回False的问题,才意识到,估计不换是不行了。这明显是超出了取值范围,但2038年的问题按理说只存在于32位系统下,我系统是64位,那就只能是PHP的问题了。果断升级到7,问题解决。

但是,但是,但是!解决问题的同时往往会制造新的麻烦。此乃真理~ 所以,所有使用了模板的页面全都空白了。

初步怀疑是模板解析出了问题,追变量吧。display()、fetch()、tag()、B()这几个函数看下来,还是没能解决问题。因为B()里边是以这种形式进行调用的:$behavior->$method($params); 不太方便追踪,都打印出来又乱(我是个得了懒癌的强迫症),于是换一种简单的思路,读Log。

运行完页面,看Log如下(节选):
NOTIC: [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead D:\PHP\WWW\ThinkPHP\Lib\Core\Db.class.php 第 605 行.
NOTIC: [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead D:\PHP\WWW\ThinkPHP\Lib\Template\ThinkTemplate.class.php 第 273 行.
NOTIC: [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead D:\PHP\WWW\ThinkPHP\Lib\Template\ThinkTemplate.class.php 第 168 行.
NOTIC: [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead D:\PHP\WWW\ThinkPHP\Lib\Template\ThinkTemplate.class.php 第 404 行.
NOTIC: [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead D:\PHP\WWW\ThinkPHP\Lib\Template\ThinkTemplate.class.php 第 404 行.
NOTIC: [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead D:\PHP\WWW\ThinkPHP\Lib\Template\ThinkTemplate.class.php 第 404 行.
NOTIC: [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead D:\PHP\WWW\ThinkPHP\Lib\Template\ThinkTemplate.class.php 第 404 行.
NOTIC: [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead D:\PHP\WWW\ThinkPHP\Lib\Template\ThinkTemplate.class.php 第 399 行.
NOTIC: [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead D:\PHP\WWW\ThinkPHP\Lib\Template\ThinkTemplate.class.php 第 404 行.
NOTIC: [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead D:\PHP\WWW\ThinkPHP\Lib\Template\ThinkTemplate.class.php 第 404 行.
NOTIC: [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead D:\PHP\WWW\ThinkPHP\Lib\Template\ThinkTemplate.class.php 第 404 行.
NOTIC: [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead D:\PHP\WWW\ThinkPHP\Lib\Template\ThinkTemplate.class.php 第 404 行.
NOTIC: [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead D:\PHP\WWW\ThinkPHP\Lib\Template\ThinkTemplate.class.php 第 197 行.
NOTIC: [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead D:\PHP\WWW\ThinkPHP\Lib\Template\ThinkTemplate.class.php 第 137 行.
复制代码
错误基本都在ThinkTemplate.class.php里,看文件名,这个是操作模板的。错误的原因是因为PHP7里删除了preg_replace()的/e参数,其实这个参数在PHP5里就已经废除了,只不过没有删除,所以还能用。官方给出的建议是,用preg_replace_callback()代替preg_replace() /e。

以ThinkTemplate.class.php 第 404 行左右的代码为例,修改如下:
if(!$closeTag)
{
    /*
    $patterns = '/'.$begin.$parseTag.$n1.'\/(\s*?)'.$end.'/eis';
    $replacement = "\$this->parseXmlTag('$tagLib', '$tag', '$1', '')";
    $content = preg_replace($patterns, $replacement, $content);
    */
    
    // By Legolas 2016-06-28 00:59
    $patterns = '/'.$begin.$parseTag.$n1.'\/(\s*?)'.$end.'/is';
    $content = preg_replace_callback($patterns, function($match)use($tagLib, $tag){return $this->parseXmlTag($tagLib, $tag, $match[1], '');},$content);
}
else
{
    /*
    $patterns = '/'.$begin.$parseTag.$n1.$end.'(.*?)'.$begin.'\/'.$parseTag.'(\s*?)'.$end.'/eis';
    $replacement = "\$this->parseXmlTag('$tagLib', '$tag', '$1', '$2')";
    for($i=0; $i<$level; $i++)
    {
        $content = preg_replace($patterns, $replacement, $content);
    }
    */
    // By Legolas 2016-06-28 00:52
    $patterns = '/'.$begin.$parseTag.$n1.$end.'(.*?)'.$begin.'\/'.$parseTag.'(\s*?)'.$end.'/is';
    for($i=0; $i<$level; $i++)
    {
        $content = preg_replace_callback($patterns, function ($match)use($tagLib, $tag){return $this->parseXmlTag($tagLib, $tag, $match[1], $match[2]);}, $content);
    }
}
复制代码
把Log中报错的位置都改掉,页面就可以正常显示了。

关于正则,再多说两句:
1、正则中,“/1”、“$1”表示第一个括号匹配的内容,“/2”、“$2”表示第二个括号匹配的内容,依此类推。
2、官方建议,preg_replace_callback()的回调使用匿名函数,参数$match为正则匹配的结果(数组),$match[1]表示第一个括号匹配的内容,依此类推。
3、若匿名函数需要使用外部变量,需要在定义函数时,使用use()传参。

我花了点时间,把代码里全部使用preg_replace() /e的地方,全都替换成了preg_replace_callback(),跟我一样得了懒癌不爱动手的朋友可以直接下载http://code.taobao.org/svn/share2016/trunk/ThinkPHP_Repaire.rar。如果发现BUG,欢迎指正。另外,这个框架因为是日常工作中用的,所以还集成了支付宝网页支付、极光推送、小米推送、PHPMail的第三方类库,都放在Extend\Vendor里,需要的可以直接拿来用~

----------------------------------

thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法

作者:小松博客 字体:[增加 减小] 类型:转载 时间:2016-09-30 我要评论

这篇文章主要介绍了thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法,涉及thinkPHP针对php7关键字判定的相关底层代码修改技巧,需要的朋友可以参考下

本文实例讲述了thinkphp在php7环境下提示Cannot use ‘String' as class name as it is reserved的解决方法。分享给大家供大家参考,具体如下:

我有一网站之前用php7运行thinkphp没有什么问题,但是最近发现开启验证码的时候发现有错误

Cannot use 'String' as class name as it is reserved

在google baidu搜索了一下还是没有解决方法

于是自己动手解决,看来我是第一个分享出来的人

原因:

有一个类用了string类名,php7把String定为关键字

解决方法:

文件ThinkPHP\Library\Org\Util\Image.class.php

找到:

import('ORG.Util.String');
$code = String::rand_string($length, 4);

修改成:

import('ORG.Util.Stringnew');
$code = Stringnew::rand_string($length, 4);

复制文件:

ThinkPHP\Library\Org\Util\String.class.php

保存成:

ThinkPHP\Library\Org\Util\Stringnew.class.php

打开Stringnew.class.php:

class String {

修改成:

class Stringnew {

放上去验证码出来了,我搜索了一下没有其他地方引用,这个问题解决了

-------------------------------

3 datatype 改成 mysqli

'datatype'=>'mysqli'

ThinkPHP3.1在PHP7下页面空白的解决方案相关推荐

  1. uniapp history 模式 本地开发正常,线上H5在nginx下页面空白、微信回调或者刷新出现404

    本地开发中完全正常,打包发布到线上发现页面在微信登录回调后出现 404 一.怀疑是nginx站点配置文件没有加载最新 尝试解决 SSH 进服务器查看是否有多个nginx主进程 重启nginx 二.怀疑 ...

  2. Vue项目下IE报错 SCRIPT1003: 缺少 ‘:‘,导致页面空白的解决方案

    ❝ 今年年初加入了物资团队,遇到的第一个问题就是解决IE的兼容性问题. ❞ 1 现象 当时的情况是IE浏览器在登录系统时,登录页无法加载,页面显示空白,所以也无法访问系统里的其他页面. 2 查看报错 ...

  3. vue 打包路由报错_Vue下路由History模式打包后页面空白的解决方法

    vue的路由在默认的hash模式下,默认打包一般不会有什么问题,不过hash模式由于url会带有一个#,不美观,而且在微信分享,授权登录等都会有一些坑.所以history模式也会有一些应用场景.新手往 ...

  4. dedecms m view.php,dedecms在php7下的使用方法 织梦dedecsm后台一片空白的解决方法

    dedecms在php7下的使用方法 织梦dedecsm后台一片空白的解决方法

  5. 同一个ip服务器comcat下部署第二个项目怎么设置,用nginx在同一服务器端口下部署多个项目,第二个项目打开后页面空白?...

    1.问题概括: 按照这篇文章的做法,用nginx在在服务器同一端口下部署多个项目,结果发现,第一个项目正常运行,第二个项目打开后页面空白. 2.服务器上项目文件夹的结构: /home 路径下有两个如下 ...

  6. 动态路由下刷新 页面空白

    前言 最近设计动态路由时,刷新页面空白.突然想起以前笔记里面记录过,翻看了下,今天得空儿分享出来. 问题描述 在全局前置守卫router.beforeEach里面加入动态路由设计时,刷新动态页面,明明 ...

  7. phpMyAdmin-5.2.0 php-7.4.5 nginx-1.21.6 打开页面空白

    phpMyAdmin-5.2.0   php-7.4.5    nginx-1.21.6   打开页面空白 但是打开phpinfo.php文件,是正常的... 查看日志也没有报错,折腾了好一会,无意打 ...

  8. 配置LNMP遇到的问题(页面空白,不能解析php等)以及fastcgi和php-fom的关系

    文章目录 一.前言 二.开始配置LNMP 1.下载php,nginx,mysql等 2.配置nginx 3.启动ngin和php之后,去根目录新建文件 4.页面空白,F12查看请求,在response ...

  9. react部署之页面空白

    react部署之页面空白 问题:create-react-app build打包后,页面出现空白. 可能一: 控制台报错,js等文件找不到(404) 文件路径问题,只需修改package.json文件 ...

最新文章

  1. php 千万级访问量网站,承受每天百万级访问量的网站需要多少台服务器?
  2. 带你一起学kivy第一天
  3. JS基础语法(05)-隐式数据类型转换
  4. linux——客户端服务器文件传输
  5. 使用反射获得jar包中的类、方法、参数、返回值类型,然后动态加载jar包运行方法
  6. [Unity3D]自己动手重制坦克舰队ArmadaTank
  7. 51Nod 1002 数字三角形 Label:水水水 非学习区警告
  8. java web基础视频教程_java web开发入门视频教程
  9. Android中使用webview加载网页上的按钮点击失效
  10. PHP中date时差问题解决方法
  11. NCE4 L5 Youth
  12. 一个优秀的团队的重要性
  13. gitlab artifacts too large
  14. office右键没有新建word,Visio等解决办法
  15. TM1638 LED数码显示模块ARDUINO驱动代码
  16. PHP LOL接口,电竞英雄联盟数据API接口 - 【赛事列表】API调用示例代码
  17. vue单应用在ios系统中实现微信分享功能
  18. 岁末将至,再见 2021
  19. [白话解析] 通过实例来梳理概念 :准确率 (Accuracy)、精准率(Precision)、召回率(Recall) 和 F值(F-Measure)
  20. 【SIP】Centos7搭建kamailio的SIP服务器实现网络电话

热门文章

  1. 时间序列数据的截尾和拖尾分析(Python实现)
  2. Boundary Sensitive Network (BSN) 源码运行
  3. X86机器安装麒麟UOS双系统
  4. Scrapy模拟登陆豆瓣抓取数据
  5. Java顶级大神的面试经验,竟如此超越常理
  6. 关于青蛙跳台阶问题(动态规划)
  7. 有什么软件可以测试面膜的好坏,检验面膜好坏的小妙招
  8. 十次方中的前端知识点随记
  9. DirectX12(D3D12)基础教程(二十)—— 纹理数组(Texture Array)非DDS初始化操作
  10. 创业成功率和年龄之间是啥关系?哪个年龄阶段的人最适合创业?