PHP7.0~7.4的一些新特性 (2)
in PHP with 0 comment

PHP7.0~7.4的一些新特性 (2)

in PHP with 0 comment

PHP7.0~7.4的一些新特性 (2)

说明

从官网整理一下PHP7.0~PHP7.4更新的一些新特性。算是巩固一下吧。


介绍

文章只摘录每次版本更新的一些新特性,对于版本更新的其他相关内容不做整理,小伙伴们都可以通过以下链接自己去查看。

版本目前更新到7.4 所以当前只更新到7.4

PHP7.0:https://www.php.net/manual/zh/migration70.new-features.php
PHP7.1: https://www.php.net/manual/zh/migration71.new-features.php
PHP7.2: https://www.php.net/manual/zh/migration72.new-features.php
PHP7.3: https://www.php.net/manual/zh/migration73.new-features.php
PHP7.4: https://www.php.net/manual/zh/migration74.new-features.php

PHP7.1

可为空(Nullable)类型

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

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

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

说明:如果在参数类型前加上一个问号使之允许为空,则传入的参数或者函数返回的结果要么是给定的类型,要么是 null。

Void 函数

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

<?php
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)

试图去获取一个 void 方法的返回值会得到 NULL ,并且不会产生任何警告。这么做的原因是不想影响更高层次的方法。

说明:增加一个viod 的函数返回值声明,当函数返回值声明为void时,返回值可以不写,或者为空。

短数组语法(Symmetric array destructuring)
短数组语法([])现在作为list()语法的一个备选项,可以用于将数组的值赋给一些变量(包括在foreach中)。
<?php
$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)) {
}
// [] style
foreach ($data as [$id, $name]) {
}

说明:[]现在可以当做list()的替代品,[$id1, $name1]等同于list($id1, $name1)

支持设置类常量的可见性。
<?php
class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}
iterable 伪类

现在引入了一个新的被称为iterable的伪类 (与callable类似)。 这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象。 至于子类,当用作参数时,子类可以收紧父类的iterable类型到array 或一个实现了Traversable的对象。对于返回值,子类可以拓宽父类的 array或对象返回值类型到iterable。
示例:
<?php

function iterator(iterable $iter)
{
    foreach ($iter as $val) {
        //
    }
}

说明:现在参数或者返回值类型可以被设置为iterable类型,当被设置为iterable时,代表参数或返回值必须为数组或者实现了Traversable接口的对象

多异常捕获处理

一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用。

<?php
try {
    // some code
} catch (FirstException | SecondException $e) {
    // handle first and second exceptions
}
list()现在支持键名

现在list()和它的新的[]语法支持在它内部去指定键名。这意味着它可以将任意类型的数组 都赋值给一些变量(与短数组语法类似)

<?php
$data = [
    ["id" => 1, "name" => 'Tom'],
    ["id" => 2, "name" => 'Fred'],
];
// list() style
list("id" => $id1, "name" => $name1) = $data[0];
// [] style
["id" => $id1, "name" => $name1] = $data[0];
// list() style
foreach ($data as list("id" => $id, "name" => $name)) {
    // logic here with $id and $name
}
// [] style
foreach ($data as ["id" => $id, "name" => $name]) {
    // logic here with $id and $name
}
支持为负的字符串偏移量

现在所有支持偏移量的字符串操作函数 都支持接受负数作为偏移量,包括通过[]或{}操作字符串下标。在这种情况下,一个负数的偏移量会被理解为一个从字符串结尾开始的偏移量。

<?php
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));
结果:
string (1) "e"
int(3)

说明:现在支持偏移量的字符串操作函数都支持接受负数,一般当偏移量为负值时,表示一个从字符串结尾开始的偏移量。

ext/openssl 支持 AEAD

通过给openssl_encrypt()和openssl_decrypt() 添加额外参数,现在支持了AEAD (模式 GCM and CCM)。
示例:

<?php
//$key should have been previously generated in a cryptographically safe way, like openssl_random_pseudo_bytes
$plaintext = "message to be encrypted";
$cipher = "aes-128-gcm";
if (in_array($cipher, openssl_get_cipher_methods()))
{
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = openssl_random_pseudo_bytes($ivlen);
    $ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv, $tag);
    //store $cipher, $iv, and $tag for decryption later
    $original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
    echo $original_plaintext."\n";
}
通过 Closure::fromCallable() 将callables转为闭包
<?php
class Test
{
    public function exposeFunction()
    {
        return Closure::fromCallable([$this, 'privateFunction']);
    }
    private function privateFunction($param)
    {
        var_dump($param);
    }
}

$privFunc = (new Test)->exposeFunction();
$privFunc('some value');
异步信号处理

一个新的名为 pcntl_async_signals() 的方法现在被引入, 用于启用无需 ticks (这会带来很多额外的开销)的异步信号处理。

HTTP/2 server push support in ext/curl

对服务器推送的支持现在已经被加入到 CURL 扩展中( 需要版本 7.46 或更高)。这个可以通过 curl_multi_setopt() 函数与新的常量 CURLMOPT_PUSHFUNCTION 来进行调节。常量 CURL_PUST_OK 和 CURL_PUSH_DENY 也已经被添加进来,以便服务器推送的回调函数来表明自己会同意或拒绝处理。

废弃或修改的函数

不带引号的字符串 不带引号的字符串是不存在的全局常量,转化成他们自身的字符串。 将抛出 Error 异常。
GD库遗弃png2wbmp() 和 jpeg2wbmp()函数
遗弃INTL_IDNA_VARIANT_2003 函数
遗弃__autoload() 方法
track_errors ini 设置和 $php_errormsg 变量 当开启了 track_errors ini 设置,出现非致命错误时, 会在本地作用域创建 $php_errormsg 变量。 由于提供了更好的方式: error_get_last() 来获取此类错误信息,该功能被废弃。
遗弃create_function() 函数,使用匿名函数进行处理
遗弃(unset) 类型强制转化
parse_str() 第二个参数为必选项
遗弃gmp_random()函数
遗弃each() 函数
assert()函数不再接受字符串参数
遗弃read_exif_data()函数 read_exif_data() 别名已被废弃 使用 exif_read_data() 函数代替。

结尾

没有人可以回到过去重新开始,但谁都可以从现在开始,书写一个全然不同的结局。

Responses