解析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 相关文章推荐
Extended CHM PHP 语法手册之 DIY
Oct 09 PHP
用PHP制作静态网站的模板框架(一)
Oct 09 PHP
php adodb连接mssql解决乱码问题
Jun 12 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
ThinkPHP3.1新特性之G方法的使用
Jun 19 PHP
PHP框架Swoole定时器Timer特性分析
Aug 19 PHP
PHP实现抓取HTTPS内容
Dec 01 PHP
基于命令行执行带参数的php脚本并取得参数的方法
Jan 25 PHP
使用php实现从身份证中提取生日
May 09 PHP
详谈php中 strtr 和 str_replace 的效率问题
May 14 PHP
Docker搭建自己的PHP开发环境
Feb 24 PHP
Laravel Eloquent ORM 多条件查询的例子
Oct 10 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
德生PL660的电路分析和打磨
2021/03/02 无线电
PHP学习之正则表达式
2011/04/17 PHP
php入门之连接mysql数据库的一个类
2012/04/21 PHP
解析yii数据库的增删查改
2013/06/20 PHP
php防止伪造的数据从URL提交方法
2014/06/27 PHP
微信支付扫码支付php版
2016/07/22 PHP
PHP文件上传处理案例分析
2016/10/15 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
javascript window对象属性整理
2009/10/24 Javascript
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
jquery中获得$.ajax()事件返回的值并添加事件的方法
2010/04/15 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
jQuery插件PageSlide实现左右侧栏导航菜单
2015/04/12 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
2016/05/09 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
Python利用多进程将大量数据放入有限内存的教程
2015/04/01 Python
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
python的turtle库使用详解
2019/05/10 Python
对python中各个response的使用说明
2020/03/28 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
德国运动鞋网上商店:Afew Store
2018/01/05 全球购物
会计专业应届生自荐信
2014/02/07 职场文书
培训科主任岗位职责
2014/08/08 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
2016大学生国家助学贷款承诺书
2016/03/25 职场文书
Python torch.flatten()函数案例详解
2021/08/30 Python
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫