欢迎光临
我们一直在努力

解决Thinkphp3.1不支持PHP7

参考:http://www.pangxieke.com/php/let-thinkphp3.1-support-php7.htm
http://www.thinkphp.cn/topic/40115.html
修复包:http://www.pangxieke.com/images/2017/11/ThinkPHP_Repaire.zip
http://code.taobao.org/svn/share2016/trunk/ThinkPHP_Repaire.rar

  • config.php 修改
'DB_TYPE'=>'pdo',
'DB_DSN'    => 'mysql:host=xxx;dbname=xxx',
  • preg_callback 的替换
    \ThinkPHP\Lib\Core\Dispatcher.class.php 132 行
    原版是
// 解析剩余的URL参数
                preg_replace('@(\w+)\/([^\/]+)@e', '$var[\'\\1\']=strip_tags(\'\\2\');', implode('/',$paths));

改成

// 解析剩余的URL参数
                preg_replace_callback('@(\w+)\/([^\/]+)@',function($r) use (&$var){  
                    $var[$r['1']] = strip_tags($r[2]);  
                },implode('/',$paths));  

ThinkPHP/Lib/Behavior/CheckRouteBehavior.class.php 170 行

// 解析剩余的URL参数
            if($paths) {
                preg_replace('@(\w+)\/([^\/]+)@e', '$var[strtolower(\'\\1\')]=strip_tags(\'\\2\');', implode('/',$paths));
            }

转换为

if($paths) {
                preg_replace_callback('@(\w+)\/([^\/]+)@', function($r) use (&$var){  
                    $var[strtolower($r['1'])] = strip_tags($r[2]);  
                },implode('/',$paths));  
            }

204行

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

转换为

if($regx) {
                preg_replace_callback('@(\w+)\/([^,\/]+)@',function($r) use (&$var){  
                    $var[strtolower($r['1'])] = strip_tags($r[2]);  
                },$regx);  
            }

ThinkPHP/Extend/Mode/Lite/Dispatcher.class.php 65行
···
// 解析剩余的URL参数
$res = preg_replace(‘@(\w+)’.$depr.'([^’.$depr.’/]+)@e’, ‘$var[‘\1′]=”\2″;’, implode($depr,$paths));
···
改为:

// 解析剩余的URL参数
                $res = preg_replace_callback('@(\w+)'.$depr.'([^'.$depr.'\/]+)@',function($r) use (&$var){  
                            $var[$r['1']] = $r[2];  
                        },implode($depr,$paths));  
  • PHPMAILER5.2.1 在php7下,subject会变成empty。原因是EncodeHeader输出内容为空。可以去掉EncodeHeader方法。如果你用的是SMTP方式,则可以在CreateHeader方法中修改:
    // mail() sets the subject itself
    if($this->Mailer != 'mail') {
      // $result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject)));
      $result .= $this->HeaderLine('Subject', $this->SecureHeader($this->Subject));
    }
  • 还有一些函数是在php5有,而php7没有的。例如eregi。需要逐个替换掉
    例如有个获取OS的函数
private function getOS()
    {
        $agent = $_SERVER['HTTP_USER_AGENT'];
        $os = false;
        if (eregi('win 9x', $agent) && strpos($agent, '4.90')) {
            $os = 'Windows ME';
        } else if (eregi('win', $agent) && ereg('98', $agent)) {
            $os = 'Windows 98';
        } else if (eregi('win', $agent) && eregi('nt 5.1', $agent)) {
            $os = 'Windows XP';
        } else if (eregi('win', $agent) && eregi('nt 6.1', $agent)) {
            $os = 'Windows 7';
        } else if (eregi('win', $agent) && eregi('nt 5', $agent)) {
            $os = 'Windows 2000';
        } else if (eregi('win', $agent) && eregi('nt', $agent)) {
            $os = 'Windows NT';
        } else if (eregi('win', $agent) && ereg('32', $agent)) {
            $os = 'Windows 32';
        } else if(eregi('android', $agent)) {
            $os = 'Android';
        } else if(eregi('ipad', $agent)) {
            $os = 'IPad';
        } else if(eregi('iphone', $agent)) {
            $os = 'IPhone';
        } else if(eregi('ipod', $agent)) {
            $os = 'IPod';
        } else if (eregi('Mac', $agent) && eregi('PC', $agent)) {
            $os = 'Macintosh';
        } else if (eregi('linux', $agent)) {
            $os = 'Linux';
        } else if (eregi('unix', $agent)) {
            $os = 'Unix';
        } else if (eregi('sun', $agent) && eregi('os', $agent)) {
            $os = 'SunOS';
        } else if (eregi('ibm', $agent) && eregi('os', $agent)) {
            $os = 'IBM OS/2';
        } else if (eregi('mac', $agent) && eregi('os', $agent)) {
            $os = 'Macintosh';
        } else if (eregi('PowerPC', $agent)) {
            $os = 'PowerPC';
        } else if (eregi('AIX', $agent)) {
            $os = 'AIX';
        } else if (eregi('HPUX', $agent)) {
            $os = 'HPUX';
        } else if (eregi('NetBSD', $agent)) {
            $os = 'NetBSD';
        } else if (eregi('BSD', $agent)) {
            $os = 'BSD';
        } else if (ereg('OSF1', $agent)) {
            $os = 'OSF1';
        } else if (ereg('IRIX', $agent)) {
            $os = 'IRIX';
        } else if (eregi('FreeBSD', $agent)) {
            $os = 'FreeBSD';
        } else if (eregi('teleport', $agent)) {
            $os = 'teleport';
        } else if (eregi('flashget', $agent)) {
            $os = 'flashget';
        } else if (eregi('webzip', $agent)) {
            $os = 'webzip';
        } else if (eregi('offline', $agent)) {
            $os = 'offline';
        } else {
            $os = 'Unknown';
        }
        return $os;
    }

转换后变成

private function getOS()
    {
        $agent = $_SERVER['HTTP_USER_AGENT'];
        $os = false;
        if (preg_match('/win 9x/i', $agent) && strpos($agent, '4.90')) {
            $os = 'Windows ME';
        } else if (preg_match('/win/i', $agent) && preg_match('/98/', $agent)) {
            $os = 'Windows 98';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt 5.1/i', $agent)) {
            $os = 'Windows XP';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt 6.1/i', $agent)) {
            $os = 'Windows 7';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt 5/i', $agent)) {
            $os = 'Windows 2000';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt/i', $agent)) {
            $os = 'Windows NT';
        } else if (preg_match('/win/i', $agent) && preg_match('/32/', $agent)) {
            $os = 'Windows 32';
        } else if(preg_match('/android/i', $agent)) {
            $os = 'Android';
        } else if(preg_match('/ipad/i', $agent)) {
            $os = 'IPad';
        } else if(preg_match('/iphone/i', $agent)) {
            $os = 'IPhone';
        } else if(preg_match('/ipod/i', $agent)) {
            $os = 'IPod';
        } else if (preg_match('/Mac/i', $agent) && preg_match('/PC/i', $agent)) {
            $os = 'Macintosh';
        } else if (preg_match('/linux/i', $agent)) {
            $os = 'Linux';
        } else if (preg_match('/unix/i', $agent)) {
            $os = 'Unix';
        } else if (preg_match('/sun/i', $agent) && preg_match('/os/i', $agent)) {
            $os = 'SunOS';
        } else if (preg_match('/ibm/i', $agent) && preg_match('/os/i', $agent)) {
            $os = 'IBM OS/2';
        } else if (preg_match('/mac/i', $agent) && preg_match('/os/i', $agent)) {
            $os = 'Macintosh';
        } else if (preg_match('/PowerPC/i', $agent)) {
            $os = 'PowerPC';
        } else if (preg_match('/AIX/i', $agent)) {
            $os = 'AIX';
        } else if (preg_match('/HPUX/i', $agent)) {
            $os = 'HPUX';
        } else if (preg_match('/NetBSD/i', $agent)) {
            $os = 'NetBSD';
        } else if (preg_match('/BSD/i', $agent)) {
            $os = 'BSD';
        } else if (preg_match('/OSF1/', $agent)) {
            $os = 'OSF1';
        } else if (preg_match('/IRIX/', $agent)) {
            $os = 'IRIX';
        } else if (preg_match('/FreeBSD/i', $agent)) {
            $os = 'FreeBSD';
        } else if (preg_match('/teleport/i', $agent)) {
            $os = 'teleport';
        } else if (preg_match('/flashget/i', $agent)) {
            $os = 'flashget';
        } else if (preg_match('/webzip/i', $agent)) {
            $os = 'webzip';
        } else if (preg_match('/offline/i', $agent)) {
            $os = 'offline';
        } else {
            $os = 'Unknown';
        }
        return $os;
    }
  • Model的入库区别,PHP7下必须给字段赋值,而在PHP5.6下可以不赋值。建议在Model文件下添加 _auto 属性,如下
protected  $_auto = array(
            array('direct', ''),
            array('extension', ''),
            array('mobile', ''),
            array('EDBStatus', ''),
            array('teamName', ''),
        );
  • if 语句的区别
    PHP7的语法要求比较严格,在if else 中php5.6可以用break;而在php7中是不允许的。例如phpexcle中有段代码
        if ((is_float($value)) || (is_int($value))) {
                return 1;
        } elseif(is_bool($value)) {
                return 4;
        } elseif(is_array($value)) {
                return 64;
                break; # PHP7 下会报错,需要删除掉
        } elseif(is_string($value)) {
            //  Errors
            if ((strlen($value) > 0) && ($value{0} == '#')) {
                return 16;
            }
            return 2;
        }
        return 0;
  • insertAll 在pdo中是不存在的。需要添加。
    文件路径:ThinkPHP/Extend/Driver/Db/DbPdo.class.php
    public function insertAll($datas,$options=array(),$replace=false) {
        if(!is_array($datas[0])) return false;
        $fields = array_keys($datas[0]);
        array_walk($fields, array($this, 'parseKey'));
        $values  =  array();
        foreach ($datas as $data){
            $value   =  array();
            foreach ($data as $key=>$val){
                $val   =  $this->parseValue($val);
                if(is_scalar($val)) { // 过滤非标量数据
                    $value[]   =  $val;
                }
            }
            $values[]    = '('.implode(',', $value).')';
        }
        $sql   =  ($replace?'REPLACE':'INSERT').' INTO '.$this->parseTable($options['table']).' ('.implode(',', $fields).') VALUES '.implode(',',$values);
        return $this->execute($sql);
    }

作者:爱吃秋葵的莫冲
链接:https://www.jianshu.com/p/a39f0af8f093
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

赞(1)
版权归原作者所有,如有侵权请告知。达维营-前端网 » 解决Thinkphp3.1不支持PHP7

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址