解析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邮件专题
Oct 09 PHP
IIS+PHP+MySQL+Zend配置 (视频教程)
Dec 13 PHP
PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节
Jul 09 PHP
应用开发中涉及到的css和php笔记分享
Aug 02 PHP
php ajax 静态分页过程形式
Sep 02 PHP
php类中private属性继承问题分析
Nov 01 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
Jun 25 PHP
ThinkPHP中自定义目录结构的设置方法
Aug 15 PHP
php实现URL加密解密的方法
Nov 17 PHP
asp函数split()对应php函数explode()
Feb 27 PHP
Yii框架自定义数据库操作组件示例
Nov 11 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 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/02/28 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
JS使用for循环遍历Table的所有单元格内容
2014/08/21 Javascript
jQuery实现多按钮单击变色
2014/11/27 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
jQuery编写网页版2048小游戏
2017/01/06 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
jQuery EasyUI ProgressBar进度条组件
2017/02/28 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
微信小程序使用image组件显示图片的方法【附源码下载】
2017/12/08 Javascript
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
JS加密插件CryptoJS实现AES加密操作示例
2018/08/16 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
2019/08/16 Javascript
JS实现动态星空背景效果
2019/11/01 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
Python中Continue语句的用法的举例详解
2015/05/14 Python
Python中常见的异常总结
2018/02/20 Python
基于python神经卷积网络的人脸识别
2018/05/24 Python
Python清空文件并替换内容的实例
2018/10/22 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
Python Collatz序列实现过程解析
2019/10/12 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
Python接口自动化判断元素原理解析
2020/02/24 Python
使用K.function()调试keras操作
2020/06/17 Python
伦敦平价潮流珠宝首饰品牌:Astrid & Miyu
2016/10/10 全球购物
奥巴马开学演讲观后感
2015/06/12 职场文书
2015年大学迎新晚会总结
2015/07/16 职场文书
交通安全学习心得体会
2016/01/18 职场文书
安装pytorch时报sslerror错误的解决方案
2021/05/17 Python
python四种出行路线规划的实现
2021/06/23 Python
《堡垒之夜》联动《刺客信条》 4月7日正式上线
2022/04/06 其他游戏