PHP8更新了哪些东西

PHP 8 相较于 PHP 7 进行了大量的更新,主要包括性能优化、新特性增加、语法改进以及一些弃用和移除的功能。以下是 PHP 8 的主要更新内容:


1. 性能优化

JIT(Just-In-Time 编译器)

  • 作用:PHP 8 引入了 JIT 编译器,可以将部分代码在运行时编译为机器码,提高执行速度,尤其对 计算密集型任务 有明显提升。

  • 示例

    function fibonacci($n) {
        return $n <= 1 ? $n : fibonacci($n - 1) + fibonacci($n - 2);
    }
    echo fibonacci(10);
    

    JIT 可加速此类递归计算,但对于传统 Web 开发(I/O 密集型),性能提升不明显。


2. 新语法特性

命名参数(Named Arguments)

  • 作用:调用函数时,可以使用参数名称传参,避免记住参数顺序。

  • 示例

    function greet($name, $greeting = "Hello") {
        return "$greeting, $name!";
    }
    
    echo greet(name: "Tom", greeting: "Hi"); // 输出 "Hi, Tom!"
    

match() 表达式(替代 switch

  • 作用:更简洁,支持严格类型匹配,且直接返回值。

  • 示例

    $status = 2;
    $message = match ($status) {
        1 => 'Success',
        2 => 'Processing',
        3 => 'Failed',
        default => 'Unknown',
    };
    echo $message; // 输出 "Processing"
    

Nullsafe 操作符(?->

  • 作用:避免 null 访问导致 Fatal error,减少 if 判断。

  • 示例

    $country = $user?->address?->country; // 如果 $user 或 $address 为空,则返回 null
    

联合类型(Union Types)

  • 作用:允许参数和返回值接受多个类型,提高类型安全性。

  • 示例

    function setValue(int|float $value) {
        return $value * 2;
    }
    

构造器属性提升(Constructor Property Promotion)

  • 作用:减少 class 里重复定义 property 的代码。

  • 示例

    class User {
        public function __construct(public string $name, public int $age) {}
    }
    $user = new User("Tom", 30);
    

mixed 类型

  • 作用:表示参数或返回值可以是 intfloatstringarrayobjectnull 等任意类型。

  • 示例

    function test(mixed $value) {
        var_dump($value);
    }
    

Stringable 接口

  • 作用:所有实现 __toString() 的类都自动实现 Stringable 接口,可用于类型约束。

  • 示例

    class User {
        public function __toString(): string {
            return "User object";
        }
    }
    function printString(Stringable $str) {
        echo $str;
    }
    printString(new User()); // 输出 "User object"
    

数组解包支持字符串键

  • 作用array_merge() 替代方案,支持字符串键解包。

  • 示例

    $array1 = ["a" => 1, "b" => 2];
    $array2 = ["b" => 3, "c" => 4];
    
    $result = ["x" => 0, ...$array1, ...$array2];
    print_r($result); // ["x" => 0, "a" => 1, "b" => 3, "c" => 4]
    

增强的 get_debug_type()

  • 作用:比 gettype() 更准确地返回变量类型。

  • 示例

    echo get_debug_type(42); // 输出 "int"
    

throw 语法

  • 作用throw 现在可以作为表达式使用,而不仅仅是语句。

  • 示例

    $value = $nullableVar ?? throw new Exception("Value is null");
    

match() 支持 default

  • 作用match() 现在可以有 default 选项。

  • 示例

    $result = match ($var) {
        1 => "one",
        2 => "two",
        default => "unknown",
    };
    

3. 弃用和移除的功能

移除 create_function()

  • 替代方案:使用匿名函数(function()fn())。

  • 示例

    // PHP 7
    $func = create_function('$x', 'return $x * 2;');
    
    // PHP 8
    $func = fn($x) => $x * 2;
    

移除 each()

  • 替代方案:使用 foreach()array_keys()

  • 示例

    // PHP 7
    while (list($key, $value) = each($array)) {}
    
    // PHP 8
    foreach ($array as $key => $value) {}
    

移除 implode() 反向参数

  • 替代方案:必须使用正确的参数顺序 implode($glue, $array)

  • 示例

    // PHP 7
    implode($array, ","); // 可行
    
    // PHP 8
    implode(",", $array); // 必须使用正确顺序
    

4. PHP 8.1 和 8.2 进一步改进

PHP 8.1 和 8.2 在 PHP 8 的基础上进行了进一步优化,主要增加:

  • 枚举类型(Enums)
  • readonly 关键字
  • array_is_list()
  • new in initializers

总结

版本 主要更新
PHP 8.0 JIT 编译器、Named Arguments、match()、Nullsafe 操作符、Union Types、构造器属性提升
PHP 8.1 Fibers、Readonly、Intersection Types、Array unpacking
PHP 8.2 Disjunctive Normal Form Types、readonly classes、提升 mysqli

PHP 8 的更新大大提升了性能,并增加了许多方便的语法,使代码更清晰、更易维护。如果你的项目仍在 PHP 7.x,建议尽早升级到 PHP 8!🚀

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1
jiangjun

哎,这点改了没啥用啊

3周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!