PHP 8.2 · 8.3 · 8.4 新特性速查表


PHP 8.4 / 8.3 / 8.2 新特性全景手册

🚀 PHP 8.4(2024-11 发布,生产可用)

1. 属性钩子(Property Hooks)

告别重复 getter/setter,语法级封装。

class User
{
    private string $raw = '';

    public string $name {
        get  { return ucfirst($this->raw); }
        set(string $v) { $this->raw = strtolower($v); }
    }
}

$u = new User();
$u->name = 'alice';
echo $u->name; // Alice

2. 不对称可见性(Asymmetric Visibility)

只读公开,内部可写。

class Config
{
    public private(set) string $apiKey;
    public function __construct(string $key) { $this->apiKey = $key; }
}

$c = new Config('123');
echo $c->apiKey;   // OK
$c->apiKey = 'x';  // Error

3. 延迟对象(Lazy Objects)— 官方 ORM 基石

$ref = new ReflectionClass(Product::class);
$lazy = $ref->newLazyGhost(function ($obj) {
    $obj->__construct(DB::find(1)); // 仅访问时触发
});

4. 新数组函数(array_* 家族补齐)

$nums = [1, 2, 3, 4];
$even = array_find($nums, fn($v) => $v % 2 === 0); // 2
$key = array_find_key($nums, fn($v) => $v > 3);   // 3

5. JIT 改进

  • IR 框架重构,CPU 分支预测更友好
  • WordPress 6.6 实测 +7.8 % RPS(官方数据)

⚡ PHP 8.3(2023-11 发布)

1. json_validate() — 拒绝「假 JSON」

$bad = '{"name": "alice",}';
var_dump(json_validate($bad)); // false(节省 50 % 内存,无需抛异常)

2. #[\Override] — 覆写不再靠“眼神”

abstract class Job
{
    abstract public function handle(): void;
}
class EmailJob extends Job
{
    #[\Override]
    public function handle(): void {} // 若父类改名,编译期直接报错
}

3. 类型化类常量

interface Cache
{
    public const int TTL = 3600; // 实现类必须保持 int
}

4. 动态类常量 / Enum 获取

$name = 'VERSION';
echo PHP::{$name};        // 8.3.10
enum Status { case OK; }
$case = 'OK';
echo Status::{$case}->name; // OK

💎 PHP 8.2(2022-12 发布,当前主流 LTS 标配)

1. 只读类(Readonly Classes)

readonly class DTO
{
    public function __construct(
        public string $id,
        public array  $meta = []
    ) {}
}
// 整个类隐式只读,无需逐个声明属性

2. 敏感参数隐藏 #[\SensitiveParameter]

function login(
    string $user,
    #[\SensitiveParameter] string $pass
) {
    throw new Exception('Error');
}
// 堆栈里 $pass 直接显示为 ❑

3. 新随机数引擎(Random\Engine)

use Random\Randomizer;
use Random\Engine\Xoshiro256StarStar;

$engine = new Xoshiro256StarStar(42);
$rand   = new Randomizer($engine);
echo $rand->nextInt(); // 可重复、可单元测试

4. null / false / true 独立类型

function alwaysFail(): false
{
    return false;
}

📈 一图看性能

版本 WordPress 6.6 RPS* Laravel 11 “Hello World” RPS* 内存节省**
8.2 基准 100 % 基准 100 %
8.3 +4.2 % +5.5 % json_validate 场景 −50 %
8.4 +7.8 % +9.1 % 延迟对象 −30 % ORM 内存

* 官方基准:PHP-FPM + OPcache + JIT,8 vCPU 3.2 GHz
** 对比相同负载下的峰值内存

🚦 升级红绿灯

  • 8.2 → 8.3:100 % 向下兼容,可闭眼升
  • 8.3 → 8.4:需检查
    • 属性钩子与魔术方法 __get/__set 并存时,钩子优先(行为可能变化)
    • codebase 若手工操作 readonly 属性,会触发“只写”可见性错误