解析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 相关文章推荐
discuz免激活同步登入代码修改方法(discuz同步登录)
Dec 24 PHP
PHP正则替换函数preg_replace和preg_replace_callback使用总结
Sep 22 PHP
php出现web系统多域名登录失败的解决方法
Sep 30 PHP
php实现无限级分类
Dec 24 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
Oct 27 PHP
PHP远程调试之XDEBUG
Dec 29 PHP
前端必学之PHP语法基础
Jan 01 PHP
PHP实现批量检测网站是否能够正常打开的方法
Aug 23 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
Feb 04 PHP
PHP+Ajax无刷新带进度条图片上传示例
Feb 08 PHP
PHP删除字符串中非字母数字字符方法总结
Jan 20 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 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/10/09 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
php链表用法实例分析
2015/07/09 PHP
js利用Array.splice实现Array的insert/remove
2009/01/13 Javascript
用js解决数字不能换行问题
2010/08/10 Javascript
jQuery学习笔记之Helloworld
2010/12/22 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
2011/02/14 Javascript
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
JavaScript判断用户是否对表单进行了修改的方法
2015/03/18 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
微信小程序wxml列表渲染原理解析
2019/11/27 Javascript
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
python 网络爬虫初级实现代码
2016/02/27 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
2018/12/10 Python
在python里面运用多继承方法详解
2019/07/01 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
python 递归相关知识总结
2021/03/03 Python
在校生钳工实习自我鉴定
2013/09/19 职场文书
高中毕业生自我鉴定
2013/11/03 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
共产党员公开承诺践诺书
2014/05/28 职场文书
中专毕业生的自荐书
2014/07/01 职场文书
2015年药房工作总结
2015/04/25 职场文书
年会邀请函的格式及范文五篇
2019/11/02 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
深入理解redis中multi与pipeline
2021/06/02 Redis
详解Python类和对象内容
2021/06/22 Python
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android