解析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 相关文章推荐
PHP4与PHP3中一个不兼容问题的解决方法
Oct 09 PHP
ThinkPHP分页实例
Oct 15 PHP
Yii把CGridView文本框换成下拉框的方法
Dec 03 PHP
在Windows XP下安装Apache+MySQL+PHP环境
Feb 22 PHP
php比较相似字符串的方法
Jun 05 PHP
php经典算法集锦
Nov 14 PHP
php集成动态口令认证
Jul 21 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
iOS10推送通知开发教程
Sep 19 PHP
Laravel日志用法详解
Oct 09 PHP
浅谈PHP安全防护之Web攻击
Jan 03 PHP
thinkphp5.1框架容器与依赖注入实例分析
Jul 23 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
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
2014/11/18 PHP
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
JS模块与命名空间的介绍
2013/03/22 Javascript
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
2013/08/22 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
Javascript实现网络监测的方法
2015/07/31 Javascript
JQuery解析XML的方法小结
2016/04/02 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
CentOS 安装NodeJS V8.0.0的方法
2017/06/15 NodeJs
JS仿淘宝搜索框用户输入事件的实现
2017/06/19 Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
2017/11/03 Javascript
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
[44:58]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第二场
2018/04/06 DOTA
开源Web应用框架Django图文教程
2017/03/09 Python
Mac 上切换Python多版本
2017/06/17 Python
Python实现的十进制小数与二进制小数相互转换功能
2017/10/12 Python
Python 列表理解及使用方法
2017/10/27 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
Django中cookie的基本使用方法示例
2018/02/03 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
Python 如何实现访问者模式
2020/07/28 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
高级工程师英文求职信
2014/03/19 职场文书
机关作风整顿个人整改措施2014
2014/09/17 职场文书
技术员岗位职责范本
2015/04/11 职场文书
劳动者解除劳动合同通知书
2015/04/16 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
法律意见书范文
2015/05/20 职场文书
在Centos 8.0中安装Redis服务器的教程详解
2022/03/21 Redis