sublime 常用的不易记的正则

Sublime 经常用ctrl+H , 然后用正则匹配Find all, 一键Replace all

  • 替换非包含xxx的字符行
^(?!.*母婴).+ //选中不含"母婴"字符的行
  • 匹配空白行
\s+$ //匹配空白行
  • 在行首插入某个字符
^ //匹配行首 (Find All)
  • 在行尾插入某个字符
$ //匹配行尾 (Find All)

php5.6 升级php7最佳实践

最近项目在做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主要是由于父子类同名方法,参数个数以及参数的默认值不一致,改造方法主要是对齐参数个数和参数的默认值

https://stackoverflow.com/questions/36079651/silence-declaration-should-be-compatible-warnings-in-php-7

  • $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