解析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 CLI实现简单的数据库实时监控调度
Jul 01 PHP
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
php中关于普通表单多文件上传的处理方法
Mar 25 PHP
php查找字符串出现次数的方法
Dec 01 PHP
php微信公众平台开发之获取用户基本信息
Aug 17 PHP
php+ajax制作无刷新留言板
Oct 27 PHP
WordPress中使主题支持小工具以及添加插件启用函数
Dec 22 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
Dec 31 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
May 09 PHP
PHP会话控制实例分析
Dec 24 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
Feb 13 PHP
Laravel 类和接口注入相关的代码
Oct 15 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数据类型之整数类型、浮点数的介绍
2013/04/28 PHP
PHP中$_SERVER使用说明
2015/07/05 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
event.srcElement+表格应用
2006/08/29 Javascript
javascript向flash swf文件传递参数值注意细节
2012/12/11 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
2013/12/11 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
详解javascript数组去重问题
2015/11/06 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
javaScript中的原型解析【推荐】
2016/05/05 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
jQuery点击导航栏选中更换样式的实现代码
2017/01/23 Javascript
javascript ES6中箭头函数注意细节小结
2017/02/17 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
2018/02/01 Javascript
解决修复npm安装全局模块权限的问题
2018/05/17 Javascript
浅谈Node.js 中间件模式
2018/06/12 Javascript
opencv 识别微信登录验证滑动块位置
2018/08/07 Javascript
详解用场景去理解函数柯里化(入门篇)
2019/04/11 Javascript
JS使用iView的Dropdown实现一个右键菜单
2019/05/06 Javascript
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
Python实现简单的HttpServer服务器示例
2017/09/25 Python
Python实现邮件的批量发送的示例代码
2018/01/23 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
学python需要去培训机构吗
2020/07/01 Python
简单了解Python字典copy与赋值的区别
2020/09/16 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
美国健康和保健平台:healtop
2020/07/02 全球购物
Jdbc数据访问技术面试题
2012/03/30 面试题
安全生产计划书
2014/05/04 职场文书
讲文明知礼仪演讲稿
2014/09/13 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书