PHP7新特性

标量类型声明

默认情况下,所有的PHP文件都处于弱类型校验模式。
PHP 7 增加了标量类型声明的特性,标量类型声明有两种模式:
强制模式 (默认)
严格模式
标量类型声明语法格式:

declare(strict_types=1); 

代码中通过指定 strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句;0表示弱类型校验模式。

以下例子将触发Fatal error:

function test(int $num)
{
    return $num+1;
}

var_dump(test('string');
Fatal error: Uncaught TypeError: Argument 1 passed to test() must be of the type int, string given, called

返回值类型声明

PHP 7 增加了对返回类型声明的支持。 类似于参数类型声明,返回类型声明指明了函数返回值的类型。可用的类型与参数声明中可用的类型相同。

<?php

function arraysSum(array ...$arrays): array
{
    return array_map(function(array $array): int {
        return array_sum($array);
    }, $arrays);
}

print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

??运算符

PHP7中??运算符相当于

isset($a)? $a : $b;

判断一个变量是a否存在,存在则赋值变量a,不存在赋值变量b。
注意是判断一个变量是否存在,而不是判断一个变量是否为空。

示例:

$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';

空合并运算符赋值

$array['key'] ??= computeDefault();
// 等同于以下旧写法
if (!isset($array['key'])) {
    $array['key'] = computeDefault();
}

太空船操作符(组合比较符)

太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。 比较的原则是沿用 PHP 的常规比较规则进行的。

// 整数
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// 浮点数
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// 字符串
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

Closure::call()

绑定并调用闭包。性能相比PHP5的bindTo要快得多。
示例:

class A {private $x = 1;}

// PHP 7 之前版本的代码
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // 中间层闭包
echo $getX();

// PHP 7+ 及更高版本的代码
$getX = function() {return $this->x;};
echo $getX->call(new A);

use 组声明

从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了。

// PHP 7 之前的代码
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;

use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;

use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;

// PHP 7+ 及更高版本的代码
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};

整数除法函数 intdiv()

加的函数 intdiv() 用来进行 整数的除法运算。

var_dump(intdiv(10, 3));  //3

random_bytes

生成高安全级别的随机字符串。

function str_rand(int $length = 64){
    $length = ($length < 4) ? 4 : $length;
    return bin2hex(random_bytes(($length-($length%2))/2));
}

var_dump(str_rand());

random_int

获取生成加密安全、均匀分布的整数

var_dump(random_int(100, 999));

可为空(Nullable)类型

参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。 当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null 。
例如:

function testReturn(): ?string
{
    return 'elePHPant';
}

var_dump(testReturn());

function testReturn(): ?string
{
    return null;
}

var_dump(testReturn());

function test(?string $name)
{
    var_dump($name);
}

test('elePHPant');
test(null);
test();

以上示例为输出:

string(10) "elePHPant"
NULL
string(10) "elePHPant"
NULL
Uncaught Error: Too few arguments to function test(), 0 passed in...

Void 函数

一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,null 不是一个合法的返回值。

function swap(&$left, &$right) : void
{
    if ($left === $right) {
        return;
    }

    $tmp = $left;
    $left = $right;
    $right = $tmp;
}

$a = 1;
$b = 2;
var_dump(swap($a, $b), $a, $b);

以上示例会输出:

null
int(2)
int(1)

短数组语法([])

短数组语法([])现在作为list()语法的一个备选项,可以用于将数组的值赋给一些变量(包括在foreach中)。

$data = [
    [1, 'Tom'],
    [2, 'Fred'],
];

// list() style
list($id1, $name1) = $data[0];

// [] style
[$id1, $name1] = $data[0];

// list() style
foreach ($data as list($id, $name)) {
    // logic here with $id and $name
}

// [] style
foreach ($data as [$id, $name]) {
    // logic here with $id and $name
}

同时支持按键名指定

// list() style
list("id" => $id1, "name" => $name1) = $data[0];

// [] style
["id" => $id1, "name" => $name1] = $data[0];

属性添加限定类型

类的属性中支持添加指定的类型。
下面的例子中,会强制要求$user->id只能为int类型,同时$user->name只能为string类型。

class User {
    public int $id;
    public string $name;
}

箭头函数

箭头函数是 PHP 7.4 的新语法,是一种更简洁的 匿名函数 写法。
匿名函数和箭头函数都是 Closure 类的实现。
箭头函数的基本语法为fn (argument_list) => expr
箭头函数支持与匿名函数相同的功能,只是其父作用域的变量总是自动的。
当表达式中使用的变量是在父作用域中定义的,它将被隐式地按值捕获。在下面的例子中,函数 $fn1 和 $fn2 的行为是一样的。

$y = 1;

$fn1 = fn($x) => $x + $y;
// 相当于通过 value 使用 $y:
$fn2 = function ($x) use ($y) {
    return $x + $y;
};

var_dump($fn1(3));  //4

数组展开操作

示例1:

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

示例2:

function multiple($arg1, $arg2, $arg3){
    return $arg1 * $arg2 * $arg3;
}

echo multiple(...[1,2,3]) . PHP_EOL; //6

PHP8性特性

http://www.884358.com/php8-new-feature/

参考:
https://www.php.net/manual/zh/migration70.new-features.php
https://www.php.net/manual/zh/migration71.new-features.php
https://www.php.net/manual/zh/migration74.new-features.php

发表评论

邮箱地址不会被公开。 必填项已用*标注