解析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 相关文章推荐
如何去掉文章里的 html 语法
Oct 09 PHP
让你的PHP同时支持GIF、png、JPEG
Oct 09 PHP
PHP学习 运算符与运算符优先级
Jun 15 PHP
探讨php中遍历二维数组的几种方法详解
Jun 08 PHP
php Xdebug的安装与使用详解
Jun 20 PHP
getJSON跨域SyntaxError问题分析
Aug 07 PHP
Codeigniter购物车类不能添加中文的解决方法
Nov 29 PHP
了解PHP的返回引用和局部静态变量
Jun 04 PHP
PHP计算加权平均数的方法
Jul 16 PHP
php强大的时间转换函数strtotime
Feb 18 PHP
PHP实现的超长文本分页显示功能示例
Jun 04 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 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开启openssl的方法
2014/05/15 PHP
mac下Apache + MySql + PHP搭建网站开发环境
2014/06/02 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
php与python实现的线程池多线程爬虫功能示例
2016/10/12 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
PHP children()函数讲解
2019/02/03 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
利用毫秒减值计算时长的js代码
2013/09/22 Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
2016/09/04 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
2016/12/14 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
js 毫秒转天时分秒的实例
2017/11/17 Javascript
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
Vue实现底部侧边工具栏的实例代码
2018/09/03 Javascript
vue项目中使用bpmn为节点添加颜色的方法
2020/04/30 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
vue各种事件监听实例(小结)
2020/06/24 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
2020/10/27 Javascript
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python中函数参数调用方式分析
2018/08/09 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
django框架防止XSS注入的方法分析
2019/06/21 Python
Python调用C语言的实现
2019/07/26 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
一个入门级python爬虫教程详解
2021/01/27 Python
主题婚礼策划方案
2014/02/10 职场文书
彩色的非洲教学反思
2014/02/18 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
机关作风建设心得体会
2014/10/22 职场文书
村党总支部公开承诺书2016
2016/03/25 职场文书
MySQL修炼之联结与集合浅析
2021/10/05 MySQL
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers