Php8新增了什么

PHP 8 引入了许多新特性和改进,增强了语言的性能、可读性和可维护性。以下是 PHP 8 的一些主要新增功能和变化:

1. JIT (Just In Time) 编译器

PHP 8 引入了 JIT 编译器,旨在提高 PHP 在一些计算密集型应用中的性能。JIT 编译器将 PHP 代码在运行时编译为机器码,从而加速代码的执行,特别是在处理复杂数学计算或高性能的任务时能够显著提高性能。

  • 对大多数 Web 应用而言,性能提升不明显,但对于一些特定的计算密集型任务,JIT 可能会提供明显的提升。
# 启用 JIT 编译器(需要在 php.ini 中设置)
opcache.enable=1
opcache.jit=tracing

2. 联合类型(Union Types)

PHP 8 允许函数或方法的参数和返回值声明多个类型,称为 联合类型。这意味着可以将多个类型作为参数类型或返回类型,提供更大的灵活性。

function add(int|string $a, int|string $b): int|string {
    return $a + $b;
}

echo add(5, 10);  // 输出 15
echo add('5', '10');  // 输出 15

3. 命名参数(Named Arguments)

PHP 8 引入了 命名参数,允许通过参数名指定参数,而不必按照参数顺序传递值。这使得调用函数时更加灵活,尤其是当函数有很多参数时,可以明确指定每个参数的含义。

function foo($a, $b, $c) {
    echo "$a, $b, $c";
}

foo(a: 1, c: 3, b: 2);  // 输出 1, 2, 3

4. 属性提升(Constructor Property Promotion)

PHP 8 引入了 构造器属性提升,允许在构造函数参数中直接声明并初始化类属性,减少了冗长的代码。

class Person {
    public function __construct(
        private string $name,
        private int $age
    ) {}
}

$person = new Person("John", 30);
echo $person->name;  // 输出 John

5. Match 表达式

PHP 8 引入了一个新的 match 表达式,功能类似于 switch 语句,但具有更强的表达能力,支持严格比较(===),并且可以直接返回值。

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

echo $result;  // 输出 two

6. Nullsafe 运算符(Nullsafe Operator)

PHP 8 引入了 nullsafe 运算符,它使得对可能为 null 的对象进行方法调用或属性访问变得更加安全。使用 ?-> 运算符,可以避免由于 null 值引起的错误。

class Person {
    public function getAddress(): ?Address {
        // 返回一个 Address 对象或 null
    }
}

$person = new Person();

// 之前的做法:需要检查 null
$address = $person ? $person->getAddress() : null;

// 使用 nullsafe 运算符
$address = $person?->getAddress();

7. 类型系统的增强

PHP 8 改进了类型系统,以下是一些显著的变化:

  • 类常量支持类型声明:现在类常量可以声明类型。
  • 返回类型更强的支持:支持在返回值中使用联合类型、null 类型等。
class MyClass {
    const int $MAX_VALUE = 100;
    const string $APP_NAME = "PHP8";
}

8. 错误处理改进

PHP 8 改进了错误和异常处理,特别是在类型检查时,当类型不匹配时会抛出更清晰的错误或异常,增强了代码的可调试性。

  • ValueError 异常:当函数的输入值不符合预期时,PHP 8 会抛出 ValueError 异常。
  • TypeError 的改进:PHP 8 增强了 TypeError 的处理,确保类型不匹配时抛出更有用的信息。

9. 构造器参数类型的类型推断(Constructor Property Promotion)

在 PHP 8 中,构造函数参数中的类型会自动推断为类的属性,避免了重复声明。

class User {
    public function __construct(
        public string $name,
        public int $age
    ) {}
}

$user = new User('John', 25);
echo $user->name;  // 输出 John

10. 支持多重捕获异常(Multiple Catch Blocks)

PHP 8 支持在 try...catch 语句中一次捕获多种不同类型的异常,通过管道符 | 分隔异常类型。

try {
    throw new RuntimeException("Something went wrong");
} catch (LogicException | RuntimeException $e) {
    echo $e->getMessage();  // 处理所有运行时或逻辑异常
}

11. PHP 内建函数的改进

  • str_contains()、str_starts_with() 和 str_ends_with():这三个函数用于检查字符串是否包含某个子字符串,或者字符串是否以某个子字符串开始或结束。
$string = "Hello World";

echo str_contains($string, "World");  // 输出 true
echo str_starts_with($string, "Hello");  // 输出 true
echo str_ends_with($string, "World");  // 输出 true

12. throw 表达式

PHP 8 允许在表达式中使用 throw,这使得在语句中直接抛出异常变得更加灵活,尤其是当你想在 return?? 等操作中抛出异常时。

$foo = true;

$bar = $foo ? 42 : throw new Exception("An error occurred");

13. 抽象方法可以声明 static

在 PHP 8 中,抽象类的方法可以声明为 static,这增强了面向对象编程的灵活性。

abstract class Base {
    abstract public static function create(): self;
}

class Derived extends Base {
    public static function create(): self {
        return new self();
    }
}

14. 优化性能

PHP 8 引入了大量的性能优化,特别是在 OPcache 和 JIT 编译方面。它使得 PHP 8 相比于 PHP 7 版本在处理大规模 Web 应用时的性能更加优秀。

15. 其他改进

  • fdiv() 函数:一个新的数学函数,用于执行除法并返回浮动结果。
  • 新的 str_split() 函数返回类型:返回一个数组。
  • filter_var() 函数支持更多的验证选项
  • random_int()random_bytes() 作为安全的随机数生成方法

总结:

PHP 8 在语言本身上做了很多现代化的改进,从性能提升(如 JIT 编译器)到语言特性的增强(如联合类型、命名参数、match 表达式等)。这些新特性大大提高了 PHP 开发的灵活性、可读性和效率,同时也改善了错误处理和性能优化。如果你还没有迁移到 PHP 8,值得考虑进行更新,特别是对于新的项目,利用这些新特性将会带来很大的好处。

Review after registration

login page

  • Mrs. Laurie Hayes 🍊 2个月前
    🍊🍊🍊🍊🍊🍊🍊🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎

  • Summer 🍊 2个月前
    🍊🍊🍊🍊🍊🍊🍊🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎

  • Sydnie Wiegand 🍊 2个月前
    🍊🍊🍊🍊🍊🍊🍊🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎

  • Jacey O'Conner 🍊 2个月前
    🍊🍊🍊🍊🍊🍊🍊🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎

  • Summer 🍊 2个月前
    🍊🍊🍊🍊🍊🍊🍊🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎