解析PHP 5.5 新特性


Posted in PHP onJuly 02, 2013

PHP5.5 前不久前刚刚发布,里面的新特性有什么?官方文档在这里:
http://www.php.net/manual/zh/migration55.new-features.php
1 生成器 yield关键字
yield的中文文档在这里:http://php.net/manual/zh/language.generators.overview.php
查看文档,能知道yield的一个功能就是能有效的降低迭代的内存开销。比如官网的这个xrange例子:

<?php 
function xrange($start, $limit, $step = 1) { 
    for ($i = $start; $i <= $limit; $i += $step) { 
        yield $i; 
    } 
} echo 'Single digit odd numbers: '; 
/* 
 * Note that an array is never created or returned, 
 * which saves memory. 
 */
foreach (xrange(1, 9, 2) as $number) { 
    echo "$number "; 
} 
echo "\n"; 
?>

这里的xrange是一个迭代,功能和range是一样的,如果使用range函数的话,那么函数内部实现会储存每个迭代的中间过程,即每个中间变量都有个内存空间,那么首先程序使用的内存空间就大了,而且分配内存,回收内存都会导致程序的运行时间加长。但是如果使用上yield实现的xrange函数的话,里面所有的中间变量都只使用一个内存$i,这样节省的时间和空间都会变小。

那么为什么yield会有这样的效果呢?联想到lua中的yield,这里就算是协程的概念了。在lua语言中,当程序运行到yield的时候,使用协程将上下文环境记录住,然后将程序操作权归还到主函数,当主函数调用resume的时候,会重新唤起协程,读取yield记录的上下文。这样形成了程序语言级别的多协程操作。php 5.5这里的yield也是同样的道理,当程序运行到yield的时候,当前程序就唤起协程记录上下文,然后主函数继续操作,只是php中没有使用如resume一样的关键字,而是“在使用的时候唤起”协程。比如上例中的foreach迭代器就能唤起yield。所以上面的这个例子就能理解了。

其实照着引用yield来说,好多内部函数,特别是迭代有关的函数应该都有可能进行优化。或许后续会有yield版本和非yield版本的实现同一功能的函数把。

2 finally关键字
这个和java中的finally一样,经典的try ... catch ... finally 三段式异常处理。

3 foreach 支持list()
对于“数组的数组”进行迭代,之前需要使用两个foreach,现在只需要使用foreach + list了,但是这个数组的数组中的每个数组的个数需要一样。看文档的例子一看就明白了。

<?php 
$array = [ 
    [1, 2], 
    [3, 4], 
]; foreach ($array as list($a, $b)) { 
    echo "A: $a; B: $b\n"; 
} 
?>

4 empty() 支持自定义函数了
之前empty()中的参数是不能为函数的。现在可以了
<?php 
function foo(){ 
    return false; 
} if(empty(foo())){ 
    echo 11; 
} else { 
    echo 12; 
}

5 非变量array和string也能支持下标获取了
<?php echo array(1, 2, 3)[0]; 
echo [1, 2, 3][0]; 
echo "foobar"[2]; 
?>

6 类名通过::class可以获取
<?php 
namespace Name\Space; 
class ClassName {} echo ClassName::class; 
echo "\n"; 
?>

7 增加了opcache扩展
使用opcache会提高php的性能,你可以和其他扩展一样静态编译(--enable-opcache)或者动态扩展(zend_extension)加入这个优化项。
PHP 相关文章推荐
php 生成随机验证码图片代码
Feb 08 PHP
discuz authcode 经典php加密解密函数解析
Jul 12 PHP
ini_set的用法介绍
Jan 07 PHP
php生成excel文件的简单方法
Feb 08 PHP
thinkphp特殊标签用法概述
Nov 24 PHP
php格式化json函数示例代码
May 12 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
May 27 PHP
PHP 微信扫码支付源代码(推荐)
Nov 03 PHP
浅谈php fopen下载远程文件的函数
Nov 18 PHP
PHP内置加密函数详解
Nov 20 PHP
php解决crontab定时任务不能写入文件问题的方法分析
Sep 16 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
Oct 24 PHP
php仿QQ验证码的实例分析
Jul 01 #PHP
计算php页面运行时间的函数介绍
Jul 01 #PHP
php 地区分类排序算法
Jul 01 #PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
Jul 01 #PHP
php 常用算法和时间复杂度
Jul 01 #PHP
关于php循环跳出的问题
Jul 01 #PHP
深入解析PHP中的(伪)多线程与多进程
Jul 01 #PHP
You might like
yii框架builder、update、delete使用方法
2014/04/30 PHP
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
2014/06/12 PHP
php获取远程文件内容的函数
2015/11/02 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
2017/07/13 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
jQuery Ajax 实例全解析
2011/04/20 Javascript
浅析JavaScript原型继承的陷阱
2013/12/03 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
极力推荐一款小巧玲珑的可视化编辑器bootstrap-wysiwyg
2016/05/27 Javascript
javascript this详细介绍
2016/09/19 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
js禁止表单重复提交
2017/08/29 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
Python批量发送post请求的实现代码
2018/05/05 Python
django+xadmin+djcelery实现后台管理定时任务
2018/08/14 Python
Python使用pickle模块储存对象操作示例
2018/08/15 Python
python之cv2与图像的载入、显示和保存实例
2018/12/05 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
HTML5中判断用户是否正在浏览页面的方法
2014/05/03 HTML / CSS
"引用"与多态的关系
2013/02/01 面试题
中学门卫岗位职责
2013/12/26 职场文书
大学生实习感言
2014/01/16 职场文书
营销总经理岗位职责
2014/02/02 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
单位工作证明
2014/10/07 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
2021/06/09 Vue.js