解析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无敌近乎加密方式!
Jul 17 PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
PHPExcel读取Excel文件的实现代码
Dec 06 PHP
php ci框架验证码实例分析
Jun 26 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
Aug 21 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
Mar 19 PHP
PHP连接MSSQL方法汇总
Feb 05 PHP
老生常谈文本文件和二进制文件的区别
Feb 27 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
Aug 31 PHP
PHP asXML()函数讲解
Feb 03 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 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中调用其他系统http接口的方法说明
2014/02/28 PHP
Smarty模板学习笔记之Smarty简介
2014/05/20 PHP
PHP目录操作实例总结
2016/09/27 PHP
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
JavaScript之AOP编程实例
2015/07/17 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
2016/09/15 Javascript
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
微信小程序如何获取用户信息
2018/01/26 Javascript
vue内置组件transition简单原理图文详解(小结)
2018/07/12 Javascript
JS中‘hello’与new String(‘hello’)引出的问题详解
2018/08/14 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
微信小程序页面间跳转传参方式总结
2019/06/13 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
2019/10/31 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
解决vue的router组件component在import时不能使用变量问题
2020/07/26 Javascript
python调用系统ffmpeg实现视频截图、http发送
2018/03/06 Python
python3.6的venv模块使用详解
2018/08/01 Python
python虚拟环境完美部署教程
2019/08/06 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
2020/04/20 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
Python实现我的世界小游戏源代码
2021/03/02 Python
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
Java程序员面试题
2013/07/15 面试题
写好自荐信要注意的问题
2013/11/10 职场文书
创业计划书中要认真思考的问题
2013/12/28 职场文书
食品业务员岗位职责
2014/03/18 职场文书
《风娃娃》教学反思
2014/04/19 职场文书
关于环保的建议书
2014/05/12 职场文书
党旗在我心中演讲稿
2014/09/15 职场文书
2014年管理工作总结
2014/11/22 职场文书
校园广播稿范文
2015/08/19 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android
Python中的 No Module named ***问题及解决
2022/07/23 Python