解析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 相关文章推荐
WINXP下apache+php4+mysql
Nov 25 PHP
PHP下通过系统信号量加锁方式获取递增序列ID
Sep 25 PHP
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
Nov 10 PHP
PHP高自定义性安全验证码代码
Nov 27 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
Jun 17 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
Dec 25 PHP
php中文验证码实现示例分享
Jan 12 PHP
php实现window平台的checkdnsrr函数
May 27 PHP
详解WordPress开发中的get_post与get_posts函数使用
Jan 04 PHP
PHP实现上传多文件示例代码
Feb 20 PHP
php 调用ffmpeg获取视频信息的简单实现
Apr 03 PHP
laravel实现于语言包的完美切换方法
Sep 29 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
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
使用Discuz关键词服务器实现PHP中文分词
2014/03/11 PHP
初学JavaScript_03(ExtJs Grid的简单使用)
2008/10/02 Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
js跨域请求的5中解决方式
2015/07/02 Javascript
实例详解JavaScript获取链接参数的方法
2016/01/01 Javascript
JavaScript实现99乘法表及隔行变色实例代码
2016/02/24 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
详解webpack 多页面/入口支持&amp;公共组件单独打包
2017/06/29 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
详解Next.js页面渲染的优化方案
2019/01/27 Javascript
JS实现电话号码的字母组合算法示例
2019/02/26 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
[40:17]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第一场
2018/04/06 DOTA
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
python中os模块详解
2016/10/14 Python
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
python更改已存在excel文件的方法
2018/05/03 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
python如何实现数据的线性拟合
2019/07/19 Python
python基于K-means聚类算法的图像分割
2019/10/30 Python
解决导入django_filters不成功问题No module named 'django_filter'
2020/07/15 Python
Python Charles抓包配置实现流程图解
2020/09/29 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
使用CSS3编写灰阶滤镜来制作黑白照片效果的方法
2016/05/09 HTML / CSS
Mavi牛仔裤美国官网:土耳其著名牛仔品牌
2016/09/24 全球购物
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
计算机大学生的自我评价
2013/10/15 职场文书
大学英语演讲稿(中英文对照)
2014/01/14 职场文书
安全教育感言
2014/03/04 职场文书
婚宴邀请函
2015/01/30 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书
Go各时间字符串使用解析
2021/04/02 Golang