@php What are the important new features of PHP 8.3? Please provide a brief introduction.
PHP 8.3 新特性概览
嗨 @feibisi!很高兴看到你对 PHP 8.3 感兴趣!作为 elePHPant,我来为你详细介绍 PHP 8.3 中最重要的新特性:
主要新特性
1. 类型化类常量 (Typed Class Constants)
现在可以为类常量指定类型,增强类型安全:
<?php
class Configuration {
// PHP 8.3 之前:无法指定类型
// PHP 8.3:可以指定类型
public const string API_KEY = 'abc123';
public const int MAX_RETRIES = 3;
public const array ALLOWED_METHODS = ['GET', 'POST'];
// 接口和 trait 中也支持
}
interface CacheConfig {
public const int DEFAULT_TTL = 3600;
}
// 继承时类型必须兼容
class ExtendedConfig extends Configuration {
// ✅ 正确:类型相同
public const string API_KEY = 'new-key';
// ❌ 错误:类型不兼容
// public const int API_KEY = 123; // Fatal error
}
2. 动态获取类常量/枚举成员 (Dynamic Class Constant Fetch)
现在可以使用变量来获取类常量和枚举成员:
<?php
class Status {
public const PENDING = 'pending';
public const ACTIVE = 'active';
public const INACTIVE = 'inactive';
}
$status = 'ACTIVE';
// PHP 8.3 之前:需要常量名硬编码
echo Status::ACTIVE; // "active"
// PHP 8.3:可以使用变量
echo Status::{$status}; // "active"
// 枚举中也适用
enum UserRole: string {
case ADMIN = 'admin';
case EDITOR = 'editor';
case VIEWER = 'viewer';
}
$roleName = 'ADMIN';
echo UserRole::{$roleName}->value; // "admin"
3. #[\Override] 属性
显式标记覆盖父类方法,增强代码可读性和安全性:
<?php
class ParentClass {
public function process(): void {
echo "Parent processing\n";
}
}
class ChildClass extends ParentClass {
#[\Override]
public function process(): void {
echo "Child processing\n";
parent::process();
}
// ❌ 如果父类没有这个方法,会报错
// #[\Override]
// public function nonExistentMethod() {} // Fatal error
}
$child = new ChildClass();
$child->process();
4. 只读属性改进 (Readonly Properties Improvements)
现在可以在克隆时重新初始化只读属性:
<?php
class User {
public function __construct(
public readonly string $name,
public readonly DateTimeImmutable $createdAt
) {}
public function withName(string $newName): self {
// PHP 8.3:可以在克隆时修改只读属性
return new self(
$newName,
$this->createdAt
);
}
public function __clone() {
// PHP 8.3:可以在 __clone 中重新初始化只读属性
$this->createdAt = new DateTimeImmutable();
}
}
$user1 = new User('Alice', new DateTimeImmutable('2023-01-01'));
$user2 = $user1->withName('Bob'); // ✅ 现在可以了!
5. 新的 json_validate() 函数
快速验证 JSON 字符串而不解码:
<?php
$json = '{"name": "John", "age": 30}';
// PHP 8.3 之前:需要解码并检查错误
$data = json_decode($json);
if (json_last_error() === JSON_ERROR_NONE) {
echo "Valid JSON\n";
}
// PHP 8.3:直接验证,性能更好
if (json_validate($json)) {
echo "Valid JSON\n";
}
// 还可以限制最大深度
if (json_validate($json, depth: 10)) {
echo "Valid JSON with depth <= 10\n";
}
// 性能对比:json_validate() 比 json_decode() 快约 2-3 倍
6. 新的 Randomizer 方法
Random\Randomizer 类新增实用方法:
<?php
use Random\Randomizer;
$randomizer = new Randomizer();
// 从数组中随机获取元素
$fruits = ['apple', 'banana', 'orange', 'grape'];
echo $randomizer->pickArrayKeys($fruits, 2); // 随机返回两个键
// 随机化字节序列
$bytes = $randomizer->getBytesFromString('ABCDEF0123456789', 10);
// 生成随机浮点数
$float = $randomizer->getFloat(0, 1); // 0到1之间的随机浮点数
7. 命令行 linter 支持多个文件
# PHP 8.3 之前:只能检查单个文件
php -l file.php
# PHP 8.3:可以检查多个文件
php -l file1.php file2.php file3.php
# 使用通配符
php -l src/*.php
其他重要改进
性能优化
- JIT 改进:ARM64 架构性能提升
- 垃圾回收优化:减少内存占用
- 字符串比较优化:提升
strcmp()性能
语法糖
// 深克隆只读属性
$cloned = clone $original;
// unserialize() 更严格的 E_WARNING
$data = unserialize($input, ['allowed_classes' => false]);
推荐的 Composer 包
升级到 PHP 8.3 后,可以考虑这些现代包:
{
"require": {
"php": "^8.3",
"symfony/polyfill-php83": "^1.0", // 向后兼容 polyfill
"phpstan/phpstan": "^1.10", // 静态分析,支持 8.3 特性
"rector/rector": "^0.19", // 自动升级代码到 8.3
"spatie/laravel-ignition": "^2.0" // 更好的错误页面
}
}
升级注意事项
- 测试覆盖:确保有足够的测试覆盖
- 依赖检查:使用
composer why-not php:8.3检查不兼容的包 - 逐步升级:建议从测试环境开始
- IDE 支持:确保 IDE 支持 PHP 8.3 语法
实际应用建议
<?php
// 实际应用示例:使用新特性改进代码
class ApiClient {
// 类型化常量
public const int MAX_TIMEOUT = 30;
public const array ALLOWED_METHODS = ['GET', 'POST', 'PUT'];
// 只读属性
public function __construct(
public readonly string $baseUrl,
public readonly int $timeout = self::MAX_TIMEOUT
) {}
// 使用 #[\Override]
#[\Override]
public function __clone() {
// 克隆逻辑
}
// 使用 json_validate()
public function validateResponse(string $json): bool {
return json_validate($json);
}
}
学习资源
升级建议:PHP 8.3 是一个相对平滑的升级,没有破坏性变化。建议所有运行 PHP 8.2 的项目都考虑升级,特别是为了类型化类常量和 json_validate() 的性能优势。
有问题随时问我!![]()