MENU

PHP 7.0 新特性

November 3, 2021 • Read: 1409 • PHP,编码

严格来说 7.0 已经不算是新特性了,只不过最近在看 PHP 新特性系列的文档,顺便记录一下。

标量类型声明

可以定义参数类型, 标量可以隐式转换,无法转换则会报错(例如声明 Array类型,传递 int 类型)。

PHP7.0 新增了:字符串、整型、浮点型、布尔值。PHP5时引入了:类名、接口、数组、回调类型

<?php

function Ints(int $ints)
{
    return $ints;
}
// 输出 int(2)
var_dump(Ints(2.32));

返回值类型声明

可以限制返回值类型,标量可以隐式转换,非标量且不符合声明的返回值则会报错:

<?php

function Ints(float $ints) :int
{
    var_dump($ints); // float(3.21)
    return $ints;
}

var_dump(Ints(3.21)); // int(3)

NULL 合并运算符

如果变量存在且值不为null, 它就会返回自身的值,否则返回它的第二个操作数。

<?php
    
$username = $_GET['user'] ?? 'nobody';
// 等同于
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// 返回第一个存在的变量,如果都没有则返回 nobody
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';

太空船(组合比较符)

用于比较两个表达式,表达式相等返回 0,表达式1 < 表达式2 返回 -1,否则返回 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

define 定义常量数组

可以使用 define 来定义数组常量,在 PHP 5.6 中,只能通过 const 定义。

<?php
    
define('ARRAYTEST',['name','age','sex']);

echo ARRAYTEST[0]; // 输出 name

匿名类

通过 new class 来实例化一个匿名类,这可以用来代替一些 "用后即焚" 的完整类定义。

个人理解 就是这个类 我只用一次篇,不希望别的代码再调用我的类 官方文档
<?php
interface A {
    public function log(string $msg);
}

class B {}
class C {}

// 实例化匿名类
// object(class@anonymous)#1 (0) {}
var_dump(new class implements A {
    public function log(string $msg){}
});

// object(class@anonymous)#1 (0) {}
var_dump(new class extends B{
});

// object(C)#1 
var_dump(new C());

Closure::call()

简单干练的暂时绑定一个方法到对象上闭包并调用它

Class A {private $x = 1;}

// PHP 7.0 之前的版本
$getXCB = function () {return $this->x;};
$getX = $getXCB->bindTo(new A,'A');
echo $getX(new A,'A');

// PHP 7+ 的用法
$getX = function () {return $this->x;};
echo $getX->call(new A);

为 unserialize() 提供过滤

这个特性可以提供更安全的方式解包不可靠的数据。可以通过一个数组白名单防止潜在的代码注入。

<?php

// 将所有的对象都转换为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => false]);

// 将除 MyClass 和 MyClass2 之外的所有对象都转换为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);

// 默认情况下所有的类都是可接受的,等同于省略第二个参数
$data = unserialize($foo, ["allowed_classes" => true]);

Group use declarations

同一命名空间下的类、函数、常量可以通过 use 语句,一次性导入

<?php

// 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()

用来进行整数的除法运算

<?php
var_dump(intdiv(10,3)); // 输出 int(3)

会话选项

可以在调用 session_start() 方法时传递一个 Array ,key 是设置项,value 是设置值。设置项参考官方文档:会话配置选项

<?php
session_start([
    'cache_limiter' => 'private',
    'read_and_close' => true,
]);
?>

更安全的随机

新加入的函数random_bytes()random_int() 用来产生高安全级别的随机字符串和随机整数。

<?php
// 随机生成十位字符串 
$bytes = random_bytes(5);
var_dump(bin2hex($bytes));

// 随机生成
var_dump(random_int(100, 999));
?>
Last Modified: November 5, 2021