解析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
JpGraph php柱状图使用介绍
Aug 23 PHP
php explode函数实例代码
Feb 27 PHP
无JS,完全php面向过程数据分页实现代码
Aug 27 PHP
关于svn冲突的解决方法
Jun 21 PHP
php异步多线程swoole用法实例
Nov 14 PHP
PHP简单实现HTTP和HTTPS跨域共享session解决办法
May 27 PHP
基于PHP技术开发客服工单系统
Jan 06 PHP
PHP实现浏览器中直接输出图片的方法示例
Mar 14 PHP
PHP单元测试框架PHPUnit用法详解
Jan 23 PHP
PHP连接及操作PostgreSQL数据库的方法详解
Jan 30 PHP
php反射学习之不用new方法实例化类操作示例
Jun 14 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强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
PHP获取ip对应地区和使用网络类型的方法
2015/03/11 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
php fseek函数读取大文件两种方法
2016/10/12 PHP
万能的php分页类
2017/07/06 PHP
详解PHP文件的自动加载(autoloading)
2018/02/04 PHP
你必须知道的Javascript知识点之&quot;单线程事件驱动&quot;的使用
2013/04/23 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
关于js里的this关键字的理解
2015/08/17 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
2020/01/22 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
Python实现的各种常见分布算法示例
2018/12/13 Python
Python基于滑动平均思想实现缺失数据填充的方法
2019/02/21 Python
python爬虫分布式获取数据的实例方法
2020/11/26 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
大二学期个人自我评价
2014/01/13 职场文书
销售简历自我评价
2014/01/24 职场文书
财务人员求职自荐书范文
2014/02/10 职场文书
运动会演讲稿
2014/05/07 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
大学毕业晚会开场白
2015/05/29 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python