PHP7.3常用新特性和函数

meShell · 2019-05-09

距离PHP 7.3的发布也没有过去多久,话不多说我们下面讲讲这个版本带来的新特性和函数等一系列功能。详细的官方文档请查看这里

允许在函数或方法调用中使用尾随逗号

数组已经可以实现的该功能,现在也可以调用函数中使用。请注意,此功能在函数或方法定义的时候不允许使用该特性。

<?php

class Test
{
    public function one(int $a, int $b)
    {
        return $a + $b;
    }
}

function two(string $a, string $b)
{
    return $a . $b;
}

// 在7.3以前他将是个错误的语法
echo (new Test())->one(1, 2,);

echo two('hello', 'word',);

// 错误的定义
function two(string $a, string $b,)
{
    return $a . $b;
}

Heredoc语法

在过它需要强制尾部缩进,现在这一怪癖被移除。

<?php
// 在之前:

$query = <<<SQL
    SELECT * 
    FROM `table`
    WHERE `column` = true;
SQL; // 必须在开头

// 现在:

$query = <<<SQL
    SELECT * 
    FROM `table`
    WHERE `column` = true;
        SQL;

注意:由于这种变化,一些现有的Heredocs可能会在它们的结构中使用相同的结束标记时会被破坏。

<?php
$str = <<<FOO
abcdefg
    FOO
FOO;

// Parse error: Invalid body indentation level in PHP 7.3

JSON异常

现在如果通过json_encode, json_decode两个函数执行失败会抛出一个JsonException类型的异常。

<?php
use JsonException;
use Exception;

try {
    $json = json_encode("{", JSON_THROW_ON_ERROR);
    return base64_encode($json);
} catch (JsonException $e) {
    throw new Exception('json_encode失败.', 0, $e);
}

// 在这之前
$json = json_decode("{");
if (json_last_error() !== JSON_ERROR_NONE) {
    echo json_last_error_msg() // "Syntax error"
}

list引用

list()及其简写[]语法现在支持引用。

<?php

$array = [1, 2];

list($a, &$b) = $array;

$b = 3;

// $array = [1, 3];

compact 未定义变量

在这之前如果compact如果使用了一个未定义的变量,它将被忽略。现在它抛出一个未定义的警告。

<?php

$a = 'foo';

compact('a', 'b'); 

// Notice: compact(): Undefined variable: b

弃用和删除不区分大小写的常量

查看具体的RFC描述。

<?php

namespace {
    define('NS\FOO', 42, true); // Case-insensitive constant
}

namespace Test {
    use const NS\FOO;
    var_dump(FOO); // Works
    var_dump(foo); // Warning: Use of undefined constant foo
}

新增函数

以下几个函数个人认为比较常用。

is_countable

当你一个类实现了Countable接口,我们就可以调用count函数。

<?php

class CountMe 
{ 

    protected $myCount = 3; 

    public function count() 
    { 
        return $this->myCount; 
    } 

} 

$countable = new CountMe(); 
echo count($countable); //result is "1", not as expected 
array_key_first 和 array_key_last

正如名字一样,取得数组第一项的key和取得数组最后一项的key

<?php

$array = [
    'a' => '...', 'b' => '...', 'c' => '...'
];

echo array_key_first($array); // 'a'
echo array_key_last($array); // 'c'

其实在RFC中还有array_value_first, array_value_first, 但是大多数反正了这个投票。

PHP 7.3增加了多字节字符串处理的功能,可以通过官方查看