解析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的核心Zend
Sep 05 PHP
第十节 抽象方法和抽象类 [10]
Oct 09 PHP
在PHP中使用XML
Oct 09 PHP
php下清空字符串中的HTML标签的代码
Sep 06 PHP
解析php php_openssl.dll的作用
Jul 01 PHP
MongoDB在PHP中的常用操作小结
Feb 20 PHP
php分割合并两个字符串的函数实例
Jun 19 PHP
PHP实现图片自动清理的方法
Jul 08 PHP
从性能方面考虑PHP下载远程文件的3种方法
Dec 29 PHP
Symfony2中被遗弃的getRequest()方法分析
Mar 17 PHP
thinkPHP实现MemCache分布式缓存功能
Mar 23 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
Jun 30 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+mysql写的简单留言本实例代码
2008/07/25 PHP
PHP IPV6正则表达式验证代码
2010/02/16 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
JS实现的自定义水平滚动字体插件完整实例
2016/06/17 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
如何提高javascript加载速度
2016/12/26 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
vue2.0实现前端星星评分功能组件实例代码
2018/02/12 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
JavaScript&quot;模拟事件&quot;的注意要点详解
2019/02/13 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
[05:05]给小松五分钟系列 第二期介绍为什么打DOTA2
2014/07/02 DOTA
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
Python随机生成身份证号码及校验功能
2018/12/04 Python
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
2020/03/09 Python
Python创建临时文件和文件夹
2020/08/05 Python
HTML5实现无刷新修改URL的方法
2019/11/14 HTML / CSS
财务会计实习报告体会
2013/12/20 职场文书
店长职务说明书
2014/02/04 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
纪检部部长竞选稿
2015/11/21 职场文书
python某漫画app逆向
2021/03/31 Python
在Windows下安装配置CPU版的PyTorch的方法
2021/04/02 Python
教你利用python实现企业微信发送消息
2021/05/23 Python