解析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 相关文章推荐
PHPWind 发帖回帖Api PHP版打包下载
Feb 08 PHP
FireFox浏览器使用Javascript上传大文件
Oct 30 PHP
php获得url参数中具有&amp;的值的方法
Mar 05 PHP
PHP中date与gmdate的区别及默认时区设置
May 12 PHP
php使用Jpgraph创建折线图效果示例
Feb 15 PHP
ThinkPHP下表单令牌错误与解决方法分析
May 20 PHP
Laravle eloquent 多对多模型关联实例详解
Nov 22 PHP
PHP设计模式之注册树模式分析
Jan 26 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
微信支付之JSAPI公众号支付详解
May 15 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
Sep 30 PHP
Nginx+php配置文件及原理解析
Dec 09 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
Apache中php.ini的设置方法
2013/02/28 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
PHP两种实现无级递归分类的方法
2017/03/02 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
2013/06/05 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
浅析IE10兼容性问题(frameset的cols属性)
2014/01/03 Javascript
jquery中子元素和后代元素的区别示例介绍
2014/04/02 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
体验jQuery和AngularJS的不同点及AngularJS的迷人之处
2016/02/02 Javascript
a标签置灰不可点击的实现方法
2017/02/06 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
2017/04/13 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
jquery实现点击弹出对话框
2020/02/08 jQuery
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
[01:28]国服启动器接入蒸汽平台操作流程视频
2021/03/11 DOTA
Python内置的字符串处理函数整理
2013/01/29 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
python中with用法讲解
2020/02/07 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
如何把python项目部署到linux服务器
2020/08/26 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
详解px单位html5响应式方案
2018/03/08 HTML / CSS
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
网络信息管理员岗位职责
2014/01/05 职场文书
小学生开学感言
2014/02/28 职场文书
电子工程求职信
2014/07/17 职场文书
教师自查自纠工作情况报告
2014/10/29 职场文书
《分数的意义》教学反思
2016/02/20 职场文书
html,css,javascript是怎样变成页面的
2023/05/07 HTML / CSS