PHP 5.5 新特性

本文介绍了PHP 5.5的一些关键新特性,包括Generators的引入,用于减少迭代时的内存开销;finally关键字的添加,提供更完善的异常处理;foreach循环现在支持list()操作;empty()函数接受任意表达式;非变量的数组和字符串也可使用下标;类名可以通过::class获取;以及OPCache扩展的增强,提高了PHP的性能。
摘要由CSDN通过智能技术生成

PHP 5.5 新特性

英文文档地址:http://php.net/manual/en/migration55.new-features.php

中文文档地址:http://php.net/manual/zh/migration55.new-features.php


1.新增 Generators

yield的一个功能就是能有效的降低迭代的内存开销。比如官网的这个xrange例子:

<?php
function xrange($start, $limit, $step = 1) {
    for ($i = $start; $i <= $limit; $i += $step) {
        yield $i;
    }
}

echo 'Single digit odd numbers: ';

/* 注意保存在内存中的数组绝不会被创建或返回 */ 
foreach (xrange(1, 9, 2) as $number) {
    echo "$number ";
}

以上例程会输出:

Single digit odd numbers: 1 3 5 7 9 


这里的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 控制结构现在支持通过 list() 构造将嵌套数组分离到单独的变量。例如:

<?php
$array = [
    [1, 2],
    [3, 4],
];

foreach ($array as list($a, $b)) {
    echo "A: $a; B: $b\n";
}

以上例程会输出:

A: 1; B: 2
A: 3; B: 4


4.empty() 支持任意表达式

empty() 现在支持传入一个任意表达式,而不仅是一个变量。例如:

<?php
function always_false() {
    return false;
}

if (empty(always_false())) {
    echo 'This will be printed.';
}

if (empty(true)) {
    echo 'This will not be printed.';
}
以上例程会输出:

This will be printed.


5.非变量array和string也能支持下标获取了

<?php
echo 'Array dereferencing: ';
echo [1, 2, 3][0];
echo "\n";

echo 'String dereferencing: ';
echo 'PHP'[0];
echo "\n";

以上例程会输出:

Array dereferencing: 1
String dereferencing: P

6.类名通过::class可以获取

<?php
namespace Name\Space;
class ClassName {}

echo ClassName::class;

echo "\n";

以上例程会输出:

Name\Space\ClassName


7.增加了opcache扩展

使用opcache会提高php的性能,你可以和其他扩展一样静态编译(--enable-opcache)或者动态扩展(zend_extension)加入这个优化项。



8.改进 GD


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值