php5.6 升级php7 实践方法

2020年05月19日 · Linux · 技术帮助分享 · 841次阅读

------正---文------

最近项目在做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 
     .....
}
  • 函数废弃情况

  1. split 函数改成 explode函数

  2. md5(xx) % yy 改成算术值求模

  3. count($string) 求字符长度改成strlen($string)

  4. ereg_replace 函数替换成 preg_replace函数

  5. mysql_real_escape_string函数要替换成mysqli_escape_string

  6. call_user_method_array 替换成 call_user_func_array

  7. mysql函数替换成mysqli 【php.ini中,只有extension=mysqli,而不再有extension=mysql这个扩展】

  8. ereg函数的弃用,这个可以换成preg_match

  9. spliti 函数的弃用,这个可以换成explode

  10. HTTP_RAW_POST_DATA 这个全局变量被弃用了.要改成file_get_contents

  11. end(explode(xxx))  这个写法要拆成两句 $a = explode(xxx); end($a);

  12. 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


------结---束------

『静谧星河』采用《署名-相同方式共享 4.0 国际》进行许可。如需转载请保留本文地址。
本文地址:
https://www.yuvin.cn/Linux/419.html

支持我

教程帮助解决方法LinuxCentosPHP

静谧星河最后编辑于4年前


因本站不提供交互式服务,评论均需审核后显示,敬请谅解。

添加新评论

captcha

请输入验证码