解析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 相关文章推荐
一个取得文件扩展名的函数
Oct 09 PHP
弄了个检测传输的参数是否为数字的Function
Dec 06 PHP
php下获取客户端ip地址的函数
Mar 15 PHP
基于php伪静态的实现详细介绍
Apr 28 PHP
PHP获取MSN好友列表类的实现代码
Jun 23 PHP
浅谈php的优缺点
Jul 14 PHP
PHP CURL post数据报错 failed creating formpost data
Oct 16 PHP
PHP单态模式简单用法示例
Nov 16 PHP
php 如何禁用eval() 函数实例详解
Dec 01 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
Aug 02 PHP
PHP hex2bin()函数用法讲解
Feb 25 PHP
PHP创建对象的六种方式实例总结
Jun 27 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
PHP常用代码
2006/11/23 PHP
PHP遍历并打印指定目录下所有文件实例
2014/02/10 PHP
php实现购物车功能(上)
2020/07/23 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
JavaScript 利用Cookie记录用户登录信息
2009/12/08 Javascript
JQuery live函数
2010/12/24 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
jQuery鼠标事件汇总
2015/08/30 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
2015/12/07 Javascript
JavaScript数组的一些奇葩行为
2016/01/25 Javascript
javascript实现tab响应式切换特效
2016/01/29 Javascript
Sea.JS知识总结
2016/05/05 Javascript
瀑布流的实现方式(原生js+jquery+css3)
2020/06/28 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
jQuery中ztree 点击文本框弹出下拉框的实例代码
2017/02/05 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
这应该是最详细的响应式系统讲解了
2019/07/22 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
2020/02/16 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
2020/12/01 Vue.js
python中Flask框架简单入门实例
2015/03/21 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
Django中的CBV和FBV示例介绍
2018/02/25 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
社团2014年植树节活动总结
2014/03/11 职场文书
《从现在开始》教学反思
2014/04/15 职场文书
餐饮周年庆活动方案
2014/08/14 职场文书
领导干部群众路线个人对照检查材料思想汇报
2014/09/30 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS
Python学习之os包使用教程详解
2022/03/21 Python