解析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修正代码
May 09 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
Sep 28 PHP
php实现把数组按指定的个数分隔
Feb 17 PHP
PHP的error_reporting错误级别变量对照表
Jul 08 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
Feb 15 PHP
PHP 输出缓冲控制(Output Control)详解
Aug 25 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
Nov 14 PHP
PHP中ltrim()函数的用法与实例讲解
Mar 28 PHP
PHP数据对象映射模式实例分析
Mar 29 PHP
php中钩子(hook)的原理与简单应用demo示例
Sep 03 PHP
PHP 计算两个时间段之间交集的天数示例
Oct 24 PHP
THINKPHP5.1 Config的配置与获取详解
Jun 08 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
索尼SONY SRF-S83/84电路分析和打磨
2021/03/02 无线电
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
Javascript remove 自定义数组删除方法
2009/10/20 Javascript
prototype 中文参数乱码解决方案
2009/11/09 Javascript
ASP中进行HTML数据及JS数据编码函数
2009/11/11 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
bootstrap datepicker插件默认英文修改为中文
2017/07/28 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
2017/12/20 Javascript
Vue 仿QQ左滑删除组件功能
2018/03/12 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
从零开始搭建vue移动端项目到上线的步骤
2018/10/15 Javascript
详解vuex之store源码简单解析
2019/06/13 Javascript
跟老齐学Python之??碌某?? target=
2014/09/12 Python
Python3 能振兴 Python的原因分析
2014/11/28 Python
python下10个简单实例代码
2017/11/15 Python
Python语言描述KNN算法与Kd树
2017/12/13 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
使用python接入微信聊天机器人
2020/03/31 Python
python过滤中英文标点符号的实例代码
2019/07/15 Python
Python 根据日志级别打印不同颜色的日志的方法示例
2019/08/08 Python
使用Python发现隐藏的wifi
2020/03/04 Python
matplotlib之属性组合包(cycler)的使用
2021/02/24 Python
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
百联网上商城:i百联
2017/01/28 全球购物
Java语言程序设计测试题选择题部分
2014/04/03 面试题
高三地理教学反思
2014/01/11 职场文书
八一建军节营销活动方案
2014/08/31 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
离婚协议书包括哪些内容
2014/10/16 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
志愿服务心得体会
2016/01/15 职场文书
MySQL8.0.24版本Release Note的一些改进点
2021/04/22 MySQL
mysql 索引合并的使用
2021/08/30 MySQL