php 8.1 相比 php 7.4 的核心差异在于引入了联合类型、只读属性、枚举(enum)和 fibers 等现代语言特性,同时移除了部分废弃函数并强化了类型安全。在在线运行环境中,主要差别体现在执行效率的提升、内存占用的优化以及对新语法的原生支持,开发者可以直接使用这些新特性而无需担心兼容性问题。

PHP 8.1 的联合类型与 PHP 7.4 的类型声明有何不同
PHP 8.1 正式支持联合类型(Union Types),允许一个参数或返回值接受多种类型,而 PHP 7.4 仅支持标量类型声明和类名类型提示,不支持联合类型。在在线运行中,PHP 8.1 环境能直接解析如 function test(int|string $val) 这样的语法,而 PHP 7.4 环境会抛出语法错误。

<?php
// PHP 8.1+ 支持联合类型
function processValue(int|string $value): string {
return (string) $value;
}
echo processValue(123); // 输出: 123
echo processValue("hello"); // 输出: hello
// PHP 7.4 不支持上述语法,需使用旧式写法或类型转换
function processValueOld($value) {
if (!is_int($value) && !is_string($value)) {
throw new TypeError('Expected int or string');
}
return (string) $value;
}
echo processValueOld(123); // 输出: 123
echo processValueOld("hello"); // 输出: hello
?>
PHP 8.1 的只读属性与 PHP 7.4 的属性管理有何区别
PHP 8.1 引入了只读属性(Readonly Properties),允许在对象初始化后防止属性被修改,而 PHP 7.4 没有此特性,通常需要通过构造函数封装或自定义逻辑来实现类似效果。在在线运行中,PHP 8.1 环境可以直接使用 readonly 关键字定义属性,确保数据不可变性,而 PHP 7.4 环境则无法识别该关键字。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;

<?php
// PHP 8.1+ 支持只读属性
class User {
public function __construct(
public readonly string $name,
public readonly int $id
) {}
}
$user = new User("Alice", 1);
// echo $user->name = "Bob"; // 致命错误:Cannot modify readonly property
echo $user->name; // 输出: Alice
// PHP 7.4 模拟只读行为
class UserOld {
private string $name;
private int $id;
public function __construct(string $name, int $id) {
$this->name = $name;
$this->id = $id;
}
public function getName(): string {
return $this->name;
}
public function getId(): int {
return $this->id;
}
}
$userOld = new UserOld("Alice", 1);
echo $userOld->getName(); // 输出: Alice
?>
PHP 8.1 的枚举类型如何简化状态管理
PHP 8.1 引入了枚举(Enum),提供了一种更简洁、类型安全的方式来表示一组固定的常量值,而 PHP 7.4 没有内置枚举,通常使用类常量或字符串/整数来表示状态。在在线运行中,PHP 8.1 环境可以直接使用 enum 关键字定义枚举,并利用其内置方法如 cases() 和 tryFrom() 进行状态处理,而 PHP 7.4 环境则需要手动实现类似功能。
<?php
// PHP 8.1+ 支持枚举
enum Status: string {
case Active = 'active';
case Inactive = 'inactive';
case Pending = 'pending';
}
echo Status::Active->value; // 输出: active
foreach (Status::cases() as $case) {
echo $case->value . " ";
}
// 输出: active inactive pending
$status = Status::tryFrom('active');
echo $status?->value; // 输出: active
// PHP 7.4 模拟枚举行为
class StatusOld {
const ACTIVE = 'active';
const INACTIVE = 'inactive';
const PENDING = 'pending';
public static function getAll(): array {
return [
self::ACTIVE,
self::INACTIVE,
self::PENDING
];
}
}
echo StatusOld::ACTIVE; // 输出: active
print_r(StatusOld::getAll()); // 输出: Array ( [0] => active [1] => inactive [2] => pending )
?>


















