参考: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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。