php 8.4 的属性钩子(property hooks)允许你在类中直接定义属性的 getter 和 setter 逻辑,从而彻底消除样板式的访问器方法。通过 get 和 set 关键字,你可以将原本需要单独编写的函数内联到属性声明中,显著减少代码行数并提高封装性。

如何为普通属性定义 Getter 和 Setter?
对于简单的读写需求,你可以直接在属性行后添加 get 或 set 块。如果只读,只需 get;如果只写,只需 set;如果需要双向控制,则两者都写。默认情况下,如果没有显式定义钩子,属性行为与 PHP 8.3 及之前的版本一致。

<?php
class User {
// 定义一个带 getter 和 setter 的属性
public string $name {
get {
return $this->data['name'] ?? '';
}
set {
$this->data['name'] = trim($value);
}
}
private array $data = [];
}
$user = new User();
$user->name = 'Alice';
echo $user->name; // 输出: Alice
如何实现计算型属性(Computed Properties)?
属性钩子的强大之处在于可以定义“计算属性”,即没有底层存储变量,其值由其他数据动态生成。这在处理派生数据时非常有用,例如根据用户名生成显示名称,或者根据多个字段计算总价。这种模式下,get 块必须返回一个值,而 set 块通常用于更新依赖该计算属性的基础数据。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;

<?php
class Product {
public float $price;
public int $quantity;
// 计算总价,只读
public float $total {
get {
return $this->price * $this->quantity;
}
}
}
$product = new Product();
$product->price = 10.5;
$product->quantity = 4;
echo $product->total; // 输出: 42
属性钩子如何处理类型检查和异常?
在 set 钩子中,你可以轻松插入类型检查、格式验证或业务规则校验。如果输入不符合要求,可以直接抛出异常,这比在外部调用 setter 方法时再检查更加直观和安全。此外,钩子内部可以使用 $value 变量来接收传入的值,并在赋值前对其进行任何必要的转换。


















