PHP8+,早已不再是你记忆中的样子

JIT 编译器 (Just-In-Time)

是 PHP8 最受关注的特性。它改变了 PHP 脚本的运行逻辑

  • 原理:传统的 PHP 流程是 PHP代码 -> Opcode -> 虚拟机执行。JIT 介入后,会将高频触发的 Opcode 直接编译为机器码 (x86/arm64),绕过虚拟机直接由 CPU 执行
  • 核心收益:对 CPU 密集型计算(如数学计算、图像处理)有显著提升,但对常规 Web 应用(IO 密集型)提升较小
  • 关键词:opcache.jit_buffer_size
opcache.enable=1
opcache.jit_buffer_size=100M  # 分配给机器码的内存
opcache.jit=tracing           # 推荐模式,跟踪热点代码

类型系统与语法的进化

联合类型 (Union Types)

不再需要用 @param 注释来标注多种可能的类型

// PHP 8 之前
function process($data) { /* ... */ }

// PHP 8
function process(string|int|array $data): int|float {
    return 1.0;
}

构造器属性提升 (Constructor Property Promotion)

大幅减少重复代码

// 之前需要声明属性、参数、赋值三步
class User {
    public function __construct(
        public string $name,
        public int $age,
    ) {}
}

Match 表达式

switch 更严格(严格等值检查)、更简洁,且有返回值

$status = match($code) {
    200, 300 => 'success',
    400 => 'error',
    default => 'unknown',
};

安全与容错的提升

Nullsafe 运算符 (?->)

优雅地处理嵌套调用中的 Null 值,告别一层层的 if (isset(...))

// 之前
$country =  $session->user !== null ? $session->user->getAddress()->country : null;

// 现在
$country = $session->user?->getAddress()?->country;

具名参数 (Named Arguments)

传参时指定参数名,跳过可选参数,代码可读性极强

array_fill(start_index: 0, count: 100, value: 50);

注解 (Attributes)

替代了原来不规范的 Docblock(文档注释),让代码逻辑可以被结构化地解析

#[Route("/api/user", methods: ["GET"])]
class UserController { ... }

Enums (枚举)

enum Status: string {
    case Draft = 'draft';
    case Published = 'published';
    case Archived = 'archived';

    // 还可以定义方法
    public function label(): string {
        return match($this) {
            self::Draft => '草稿',
            self::Published => '已发布',
            self::Archived => '已归档',
        };
    }
}

function updateStatus(Status $status) { /* 类型约束极其严格 */ }

Readonly (只读属性/类)

readonly 保证属性只能被初始化一次,之后无法修改。包括 Readonly Classes,让整个类变成不可变的

// PHP 8.2 只读类
readonly class PostData {
    public function __construct(
        public string $title,
        public string $author,
    ) {}
}

$post = new PostData('PHP8特性', 'Gemini');
// $post->title = '改不动'; // 直接抛出致命错误

类型化类常量 (Typed Class Constants)

显式定义常量类型

class Config {
    public const string VERSION = '1.0.0';
    public const int MAX_RETRIES = 5;
}
posted @ 2026-05-08 10:33  我已有个她  阅读(6)  评论(0)    收藏  举报