最近项目在做php7的升级,之所以升级,出于以下两个方面
php7的性能
PHP 晋级到 7.2 之后,效率直接进步了 2-3 倍,有开启 OPCCache 的 PHP 7,有测试,比 PHP 5.6 都快近 10 倍,这个差距短长常明显的。
另外,从SEO的角度来看,搜索引擎对网站速度的要求短长常看重的,如果你的网站不能以较快的速度翻开的话,搜索引擎自然是有可能给你的降权的。
PHP 7 是跨时代的版本,但是 PHP 7 在 2019 年之后就将不再维护了,PHP 7.1 和 7.2 分别晋级了一些特征之后,性能也举行一定的提升,因此建议一步到位 PHP 7.2
php7的安全支持
PHP 官网更新了版本支持列表,自2019年1月1日起,PHP 5.6 已不再受官方支持,使用 PHP 5.6 版本的网站将不再收到安全漏洞或错误更新。此外,PHP 7.0 也已于2018年12月1日结束安全支持。
基于以上两个方面,所以打算升级php7.2,由此积累了一些升级php7的经验,该工作大体个体力活,并没有想象中的那么难,即便项目代码量庞大,个人认为只是个时间问题。下面总结下php5.6升级到php7.2时遇到的一些问题:
Object类不能再被作为类名
Cannot use ‘Object’ as class name as it is reserved
解决方案:将所有Object类名全局搜出来替换成xxxObject, 比如我使用的项目是使用的框架是cake, 所以我将Object类改为了CakeObject。
Declaration of should be compatible with that…… warnings
这个Warning主要是由于父子类同名方法,参数个数以及参数的默认值不一致,改造方法主要是对齐参数个数和参数的默认值
$object =& new Controller();
要将=& new 类名()改成 = new 类名();
非循环逻辑中使用break返回,需要改成return
function add_test($condition, $key, $value){// if (ALL_VALUE == $value) { break; } //这样使用在php7中是不允许的 if (ALL_VALUE == $value) { return; } //需要改成return ..... }
函数废弃情况
split 函数改成 explode函数
md5(xx) % yy 改成算术值求模
count($string) 求字符长度改成strlen($string)
ereg_replace 函数替换成 preg_replace函数
mysql_real_escape_string函数要替换成mysqli_escape_string
call_user_method_array 替换成 call_user_func_array
mysql函数替换成mysqli 【php.ini中,只有extension=mysqli,而不再有extension=mysql这个扩展】
ereg函数的弃用,这个可以换成preg_match
spliti 函数的弃用,这个可以换成explode
HTTP_RAW_POST_DATA 这个全局变量被弃用了.要改成file_get_contents
end(explode(xxx)) 这个写法要拆成两句 $a = explode(xxx); end($a);
preg_replace 修正符e的弃用,可以用preg_replace_callback替换
第1点需要注意的是:原split 的第一个参数是pattern 正则,比如split(‘\|’, $string), 如果替换成 explode, 正确的写法:
explode("|", $string);
第5点:mysql_real_escape_string 和 mysqli_escape_string 也有区别:
mysqli_escape_string(connection,escapestring); //第一个参数是Mysql连接句柄,必填 🙁 所以改造时,要想办法传入connection mysql_real_escape_string(string,connection) //connection可选,非必填,只需要string第一个参数即可
foreach 不建议使用引用传递,正常的修改值还是能修改到的:
foreach($array as &v) { } //如果要改$array数组,要想办法用$array[$key]['xxxx'] = 'yyy';
差异主要存在:
1. 如果在循环的时候是引用的方式,对数组的修改会影响循环行为。不过PHP7版本优化了很多场景下面位置的维护。比如在循环时往数组中追加元素。在循环中追加的元素,也会进入循环
2. foreach()循环对数组内部指针不再起作用,在PHP7之前,当数组通过foreach迭代时,数组指针会移动。现在开始,不再如此 ,如果是current函数和next函数
其他PHP7 与 PHP5之间的差异,可以参考:
http://www.php7.site/tw/book/php7/foreach-changes-24.html
转载自:
https://www.clarkhu.net/?p=1672