m
PHP7.3常用新特性和函数
距离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
增加了多字节字符串处理的功能,可以通过官方查看。