解析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来自动调用不同服务器上的flash
Oct 09 PHP
建立文件交换功能的脚本(三)
Oct 09 PHP
php+mysql写的简单留言本实例代码
Jul 25 PHP
php数字转汉字代码(算法)
Oct 08 PHP
PHP 面向对象详解
Sep 13 PHP
PHP中redis的用法深入解析
Feb 20 PHP
php实现refresh刷新页面批量导入数据的方法
Dec 23 PHP
php中stdClass的用法分析
Feb 27 PHP
PHP使用mkdir创建多级目录的方法
Dec 22 PHP
PHP格式化显示时间date()函数代码
Oct 03 PHP
php伪静态验证码不显示的解决方案
Sep 26 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 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 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
PHP的SQL注入实现(测试代码安全不错)
2011/02/27 PHP
深入解析php中的foreach问题
2013/06/30 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
php实现数据库的增删改查
2017/02/26 PHP
php字符串截取函数mb_substr用法实例分析
2019/06/25 PHP
jQuery对象和Javascript对象之间转换的实例代码
2013/03/20 Javascript
让新消息在网页标题闪烁提示的jQuery代码
2013/11/04 Javascript
深入领悟JavaScript中的面向对象
2013/11/18 Javascript
一个简单的Node.js异步操作管理器分享
2014/04/29 Javascript
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
jQuery 限制输入字符串长度
2016/06/20 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
2017/01/17 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
JavaScript之Canvas_动力节点Java学院整理
2017/07/04 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
详解jQuery中的getAll()和cleanData()
2019/04/15 jQuery
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
python实现简单socket通信的方法
2016/04/19 Python
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
利用Django提供的ModelForm增删改数据的方法
2019/01/06 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
python加载自定义词典实例
2019/12/06 Python
PyQT5 emit 和 connect的用法详解
2019/12/13 Python
database面试题
2013/03/28 面试题
生物专业个人自荐信范文
2013/11/29 职场文书
机电一体化专业推荐信
2013/12/03 职场文书
最新创业融资计划书
2014/01/19 职场文书
银行员工职业规划范文
2014/01/21 职场文书
2015世界地球日活动总结
2015/02/09 职场文书
勤俭节约主题班会
2015/08/13 职场文书
纯CSS实现酷炫的霓虹灯效果
2021/04/13 HTML / CSS
使用goaccess分析nginx日志的详细方法
2021/07/09 Servers