PHP5各个版本的新功能和新特性总结php5.4-5.6(二)

来源:互联网 发布:网络诈骗判多久 编辑:程序博客网 时间:2024/06/01 07:39

PHP5.4(2012-2013)

Short Open Tag
Short Open Tag 自 PHP5.4 起总是可用。
在这里集中讲一下有关 PHP 起止标签的问题。即:

复制代码 代码如下:
<?php
// Code...
?>

通常就是上面的形式,除此之外还有一种简写形式:
复制代码 代码如下:
<? /* Code... */ ?>

还可以把
复制代码 代码如下:
<?php echo $xxoo;?>

简写成:
复制代码 代码如下:
<?= $xxoo;?>

这种简写形式被称为 Short Open Tag, 在 PHP5.3 起被默认开启,在 PHP5.4 起总是可用。
使用这种简写形式在 HTML 中嵌入 PHP 变量将会非常方便。

对于纯 PHP 文件(如类实现文件), PHP 官方建议顶格写起始标记,同时 省略 结束标记。
这样可以确保整个 PHP 文件都是 PHP 代码,没有任何输出,否则当你包含该文件后,设置 Header 和 Cookie 时会遇到一些麻烦 [注].

注:Header 和 Cookie 必须在输出任何内容之前被发送。

数组简写形式
这是非常方便的一项特征!

复制代码 代码如下:
// 原来的数组写法
$arr = array("key" => "value", "key2" => "value2");
// 简写形式
$arr = ["key" => "value", "key2" => "value2"];

Traits
所谓Traits就是“构件”,是用来替代继承的一种机制。PHP中无法进行多重继承,但一个类可以包含多个Traits.

复制代码 代码如下:
// Traits不能被单独实例化,只能被类所包含
trait SayWorld
{
    public function sayHello()
    {
        echo 'World!';
    }
}

class MyHelloWorld
{
    // 将SayWorld中的成员包含进来
    use SayWorld;
}

$xxoo = new MyHelloWorld();
// sayHello() 函数是来自 SayWorld 构件的
$xxoo->sayHello();


Traits还有很多神奇的功能,比如包含多个Traits, 解决冲突,修改访问权限,为函数设置别名等等。
Traits中也同样可以包含Traits. 篇幅有限不能逐个举例,详情参见官网 [注].
注:http://www.php.net/manual/zh/language.oop5.traits.php

内置 Web 服务器
PHP从5.4开始内置一个轻量级的Web服务器,不支持并发,定位是用于开发和调试环境。
在开发环境使用它的确非常方便。

复制代码 代码如下:
php -S localhost:8000

这样就在当前目录建立起了一个Web服务器,你可以通过 http://localhost:8000/ 来访问。
其中localhost是监听的ip,8000是监听的端口,可以自行修改。

很多应用中,都会进行URL重写,所以PHP提供了一个设置路由脚本的功能:

复制代码 代码如下:
php -S localhost:8000 index.php

这样一来,所有的请求都会由index.php来处理。
你还可以使用 XDebug 来进行断点调试。

细节修改
PHP5.4 新增了动态访问静态方法的方式:

复制代码 代码如下:
$func = "funcXXOO";
A::{$func}();

新增在实例化时访问类成员的特征:
复制代码 代码如下:
(new MyClass)->xxoo();

新增支持对函数返回数组的成员访问解析(这种写法在之前版本是会报错的):
复制代码 代码如下:
print func()[0];

PHP5.5(2013起)

yield
yield关键字用于当函数需要返回一个迭代器的时候, 逐个返回值。

复制代码 代码如下:
function number10()
{
    for($i = 1; $i <= 10; $i += 1)
        yield $i;
}

该函数的返回值是一个数组:
复制代码 代码如下:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

list() 用于 foreach
可以用 list() 在 foreach 中解析嵌套的数组:
复制代码 代码如下:
$array = [
    [1, 2, 3],
    [4, 5, 6],
];

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


结果:
复制代码 代码如下:
1 2 3
4 5 6

细节修改
不推荐使用 mysql 函数,推荐使用 PDO 或 MySQLi, 参见前文。
不再支持Windows XP.
可用 MyClass::class 取到一个类的完整限定名(包括命名空间)。
empty() 支持表达式作为参数。
try-catch 结构新增 finally 块。

PHP5.6

更好的常量
定义常量时允许使用之前定义的常量进行计算:

复制代码 代码如下:
const A = 2;
const B = A + 1;

class C
{
    const STR = "hello";
    const STR2 = self::STR + ", world";
}


允许常量作为函数参数默认值:
复制代码 代码如下:
function func($arg = C::STR2)

更好的可变函数参数
用于代替 func_get_args()

复制代码 代码如下:
function add(...$args)
{
    $result = 0;
    foreach($args as $arg)
        $result += $arg;
    return $result;
}

同时可以在调用函数时,把数组展开为函数参数:
复制代码 代码如下:
$arr = [2, 3];
add(1, ...$arr);

// 结果为 6
命名空间
命名空间支持常量和函数:
复制代码 代码如下:
namespace Name\Space {
    const FOO = 42;
    function f() { echo __FUNCTION__."\n"; }
}

namespace {
    use const Name\Space\FOO;
    use function Name\Space\f;

    echo FOO."\n";
    f();
}

0 0