PHP 8 引入了许多新的特性和改进,相比于 PHP 7,PHP 8 更加注重性能提升、代码简洁性以及更强大的开发功能。以下是 PHP 8 的一些关键新特性和改进:
1. JIT(Just-in-Time)编译器
PHP 8 引入了 JIT 编译器,这是一项重大的性能提升,能够将部分 PHP 代码转换为机器码,从而提升性能,尤其是 CPU 密集型操作。JIT 的引入使得 PHP 可以在某些特定场景下比 PHP 7 更加高效。
- JIT 编译器可以通过
opcache扩展启用。 - 尤其适用于算法计算等 CPU 密集型的任务,但对于大多数 Web 应用,性能提升并不显著。
示例:
opcache.enable=1
opcache.jit=1255
2. 构造函数属性提升(Constructor Property Promotion)
PHP 8 引入了一个非常方便的语法,允许你在构造函数参数中直接声明类属性,简化了代码并减少了冗余。
示例:
class Point {
public function __construct(
public float $x,
public float $y
) {}
}
$p = new Point(1.0, 2.0);
echo $p->x; // 输出:1.0
📌 你可以通过构造函数直接声明并初始化类的属性。
3. Union Types(联合类型)
PHP 8 支持 联合类型声明,允许函数或方法的参数和返回值接受多个类型。你可以在函数中声明多个类型,而不再仅限于单一类型。
示例:
function add(int|float $a, int|float $b): int|float {
return $a + $b;
}
echo add(10, 20); // 输出:30
echo add(10.5, 20); // 输出:30.5
📌 联合类型让函数的灵活性更强,支持多种类型的参数。
4. Match Expression(匹配表达式)
PHP 8 引入了 match 表达式,这是一个改进版的 switch 语句,支持更加严格的类型比较并且可以返回值。
示例:
$color = 'green';
$result = match ($color) {
'red' => 'Stop',
'yellow' => 'Caution',
'green' => 'Go',
default => 'Invalid color',
};
echo $result; // 输出:Go
📌 match 表达式支持严格的类型比较,不会进行类型转换。
5. Nullsafe Operator(空安全操作符)
PHP 8 引入了 空安全操作符(?->),可以避免对 null 值进行属性访问或方法调用,从而减少 null 错误的发生。
示例:
$user = getUser();
echo $user?->profile?->address; // 如果 user 或 profile 为 null,将不会报错
📌 该操作符简化了 null 检查。
6. 属性类型声明
PHP 8 支持在类的 属性 上声明类型,而不只是函数参数或返回值。这样可以更早地进行类型检查。
示例:
class User {
public string $name;
public int $age;
}
$user = new User();
$user->name = 'John';
$user->age = 30;
7. Named Arguments(命名参数)
PHP 8 引入了 命名参数,允许在调用函数时通过参数名明确指定参数的值,这使得在参数顺序不重要时更方便。
示例:
function createUser(string $name, int $age, string $email) {
echo "Name: $name, Age: $age, Email: $email";
}
createUser(name: 'John', email: 'john@example.com', age: 30); // 无需关心参数顺序
8. 属性和方法的 readonly
PHP 8 引入了 只读属性(readonly),可以声明一个只能被赋值一次的属性,通常用于不可修改的值。
示例:
class User {
public readonly string $name;
public function __construct(string $name) {
$this->name = $name;
}
}
$user = new User('John');
echo $user->name; // 输出:John
// $user->name = 'Doe'; // 会抛出错误:Cannot modify readonly property User::$name
9. str_contains(), str_starts_with(), str_ends_with()
PHP 8 增加了新的字符串函数,用于检查字符串是否包含、以某个子字符串开始或结束。
示例:
$string = "Hello, world!";
echo str_contains($string, "world"); // 输出:true
echo str_starts_with($string, "Hello"); // 输出:true
echo str_ends_with($string, "!"); // 输出:true
📌 这些函数简化了字符串操作,避免了使用 strpos 等函数进行字符串检查。
10. throw 表达式
PHP 8 引入了将 throw 作为表达式的能力,使得你可以在更复杂的表达式中抛出异常。
示例:
function test($value) {
$value < 10 ? throw new Exception('Value is too low') : null;
}
test(5); // 会抛出异常:Value is too low
11. str_ 系列函数的改进
PHP 8 引入了一些新的内置字符串函数,如 str_starts_with, str_ends_with, 和 str_contains,它们让字符串的检查变得更加简洁和易读。
12. 错误和异常的改进
PHP 8 引入了更加详细的错误报告,尤其是在 TypeError 和 ParseError 异常中,能够提供更加准确和清晰的错误信息。
13. unset() 现在支持属性
PHP 8 使得 unset() 能够用于删除对象属性,而之前它只支持删除数组元素。
示例:
class User {
public $name = "John";
}
$user = new User();
unset($user->name); // 删除属性
var_dump($user->name); // 输出:null
14. 更严格的类型检查
PHP 8 加强了类型检查的严格性,特别是在涉及到数字和字符串类型的转换时。为了解决潜在的类型安全问题,PHP 8 引入了更多的 类型异常 和 更严格的类型声明。
15. 对 mysqli 扩展的改进
PHP 8 继续改进了 mysqli 扩展,增加了对预处理语句的支持,并提高了性能和安全性。
总结
PHP 8 引入了许多新特性,使得代码更加简洁、灵活和高效。特别是性能的提升、简化的语法以及增强的类型系统都使得开发者能够编写更安全、快速、易维护的 PHP 代码。具体特性包括:
- JIT 编译器,提高性能。
- 构造函数属性提升,简化代码。
- 联合类型声明和匹配表达式。
- 空安全操作符,简化 null 检查。
- 命名参数和只读属性。
PHP 8 是一次非常重要的更新,进一步提升了 PHP 在现代 Web 开发中的竞争力。