PHP 8 引入了许多新特性和改进,增强了语言的性能、可读性和可维护性。以下是 PHP 8 的一些主要新增功能和变化:
PHP 8 引入了 JIT 编译器,旨在提高 PHP 在一些计算密集型应用中的性能。JIT 编译器将 PHP 代码在运行时编译为机器码,从而加速代码的执行,特别是在处理复杂数学计算或高性能的任务时能够显著提高性能。
# 启用 JIT 编译器(需要在 php.ini 中设置)
opcache.enable=1
opcache.jit=tracing
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
PHP 8 引入了 命名参数,允许通过参数名指定参数,而不必按照参数顺序传递值。这使得调用函数时更加灵活,尤其是当函数有很多参数时,可以明确指定每个参数的含义。
function foo($a, $b, $c) {
echo "$a, $b, $c";
}
foo(a: 1, c: 3, b: 2); // 输出 1, 2, 3
PHP 8 引入了 构造器属性提升,允许在构造函数参数中直接声明并初始化类属性,减少了冗长的代码。
class Person {
public function __construct(
private string $name,
private int $age
) {}
}
$person = new Person("John", 30);
echo $person->name; // 输出 John
PHP 8 引入了一个新的 match
表达式,功能类似于 switch
语句,但具有更强的表达能力,支持严格比较(===
),并且可以直接返回值。
$result = match (2) {
1 => "one",
2 => "two",
3 => "three",
default => "unknown",
};
echo $result; // 输出 two
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();
PHP 8 改进了类型系统,以下是一些显著的变化:
null
类型等。class MyClass {
const int $MAX_VALUE = 100;
const string $APP_NAME = "PHP8";
}
PHP 8 改进了错误和异常处理,特别是在类型检查时,当类型不匹配时会抛出更清晰的错误或异常,增强了代码的可调试性。
ValueError
异常:当函数的输入值不符合预期时,PHP 8 会抛出 ValueError
异常。TypeError
的改进:PHP 8 增强了 TypeError
的处理,确保类型不匹配时抛出更有用的信息。在 PHP 8 中,构造函数参数中的类型会自动推断为类的属性,避免了重复声明。
class User {
public function __construct(
public string $name,
public int $age
) {}
}
$user = new User('John', 25);
echo $user->name; // 输出 John
PHP 8 支持在 try...catch
语句中一次捕获多种不同类型的异常,通过管道符 |
分隔异常类型。
try {
throw new RuntimeException("Something went wrong");
} catch (LogicException | RuntimeException $e) {
echo $e->getMessage(); // 处理所有运行时或逻辑异常
}
$string = "Hello World";
echo str_contains($string, "World"); // 输出 true
echo str_starts_with($string, "Hello"); // 输出 true
echo str_ends_with($string, "World"); // 输出 true
throw
表达式PHP 8 允许在表达式中使用 throw
,这使得在语句中直接抛出异常变得更加灵活,尤其是当你想在 return
、??
等操作中抛出异常时。
$foo = true;
$bar = $foo ? 42 : throw new Exception("An error occurred");
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();
}
}
PHP 8 引入了大量的性能优化,特别是在 OPcache 和 JIT 编译方面。它使得 PHP 8 相比于 PHP 7 版本在处理大规模 Web 应用时的性能更加优秀。
fdiv()
函数:一个新的数学函数,用于执行除法并返回浮动结果。str_split()
函数返回类型:返回一个数组。filter_var()
函数支持更多的验证选项。random_int()
和 random_bytes()
作为安全的随机数生成方法。PHP 8 在语言本身上做了很多现代化的改进,从性能提升(如 JIT 编译器)到语言特性的增强(如联合类型、命名参数、match 表达式等)。这些新特性大大提高了 PHP 开发的灵活性、可读性和效率,同时也改善了错误处理和性能优化。如果你还没有迁移到 PHP 8,值得考虑进行更新,特别是对于新的项目,利用这些新特性将会带来很大的好处。