解析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+MySql编写聊天室
Oct 09 PHP
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
Nov 01 PHP
php切割页面div内容的实现代码分享
Jul 31 PHP
PHP使用GIFEncoder类处理gif图片实例
Jul 01 PHP
php用ini_get获取php.ini里变量值的方法
Mar 04 PHP
php实现用于删除整个目录的递归函数
Mar 16 PHP
Laravel 5框架学习之向视图传送数据
Apr 08 PHP
php操作redis缓存方法分享
Jun 03 PHP
PHP中的print_r 与 var_dump 输出数组
Jun 13 PHP
phpcms配置列表页以及获得文章发布时间
Jul 04 PHP
php+mysql实现的无限分类方法类定义与使用示例
May 27 PHP
php实现统计IP数及在线人数的示例代码
Jul 22 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 方便水印和缩略图的图形类
2009/05/21 PHP
php实现的RSS生成类实例
2015/04/23 PHP
Nginx实现反向代理
2017/09/20 Servers
PHP递归统计系统中代码行数
2019/09/19 PHP
laravel5环境隐藏index.php后缀(apache)的方法
2019/10/12 PHP
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
javascript parseInt与Number函数的区别
2010/01/21 Javascript
JQUERY操作JSON实例代码
2010/02/09 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
JavaScript限定图片显示大小的方法
2015/03/11 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
谈谈JavaScript中function多重理解
2015/08/28 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
2016/03/16 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
浅谈angularjs依赖服务注入写法的注意点
2017/04/24 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
详解React之父子组件传递和其它一些要点
2018/06/25 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
Vue请求java服务端并返回数据代码实例
2019/11/28 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
Python利用ansible分发处理任务
2015/08/04 Python
python出现&quot;IndentationError: unexpected indent&quot;错误解决办法
2017/10/15 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
CSS3 实现侧边栏展开收起动画
2014/12/22 HTML / CSS
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
《小蝌蚪找妈妈》教学反思
2014/02/21 职场文书
电钳工人个人求职信
2014/05/10 职场文书
股指期货心得体会
2014/09/13 职场文书
计算机实训报告总结
2014/11/05 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书
python计算列表元素与乘积详情
2022/08/05 Python