美文网首页我爱编程PHP
解决Thinkphp3.1不支持PHP7

解决Thinkphp3.1不支持PHP7

作者: 爱吃秋葵的莫冲 | 来源:发表于2018-04-08 10:04 被阅读792次

    参考: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);
        }
    

    相关文章

      网友评论

        本文标题:解决Thinkphp3.1不支持PHP7

        本文链接:https://www.haomeiwen.com/subject/pukphftx.html