解析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执行速度全攻略(下)
Oct 09 PHP
自定义php类(查找/修改)xml文档
Mar 26 PHP
在PHP中使用X-SendFile头让文件下载更快
Jun 01 PHP
php实现的Captcha验证码类实例
Sep 22 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
Sep 27 PHP
php检测数组长度函数sizeof与count用法
Nov 17 PHP
基于CakePHP实现的简单博客系统实例
Jun 28 PHP
Linux安装配置php环境的方法
Jan 14 PHP
PHP不使用递归的无限级分类简单实例
Nov 05 PHP
PHP DB 数据库连接类定义与用法示例
Mar 11 PHP
PHP标准库(PHP SPL)详解
Mar 16 PHP
PHP MVC框架中类的自动加载机制实例分析
Sep 18 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
PHILIPS L4X25T电路分析和打理
2021/03/02 无线电
PHP 一个比较完善的简单文件上传
2010/03/25 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
PHP中的正则表达式实例详解
2017/04/25 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
django中的ajax组件教程详解
2018/10/18 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
ExtJs 3.1 XmlTreeLoader Example Error
2010/02/09 Javascript
jquery 模拟类搜索框自动完成搜索提示功能(改进)
2010/05/24 Javascript
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
概述jQuery中的ajax方法
2016/12/16 Javascript
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
python实现目录树生成示例
2014/03/28 Python
Python中字符编码简介、方法及使用建议
2015/01/08 Python
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
Python使用functools模块中的partial函数生成偏函数
2016/07/02 Python
Python中标准模块importlib详解
2017/04/16 Python
Python实现KNN邻近算法
2021/01/28 Python
推荐10款最受Python开发者欢迎的Python IDE
2018/09/16 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
2019/07/03 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
python中有函数重载吗
2020/05/28 Python
英国足球店:UK Soccer Shop
2017/11/19 全球购物
经典大学生求职信范文
2014/01/06 职场文书
施工材料员岗位职责
2014/02/12 职场文书
化工专业自荐书
2014/06/16 职场文书
公司活动总结范文
2014/07/01 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
2014会计年终工作总结
2014/12/20 职场文书
公司总经理岗位职责
2015/04/01 职场文书
放假通知
2015/04/14 职场文书