PHP 8.4 属性钩子,我把一堆 getter 收了
排盘对象里有不少只读字段,以前要么写成 public,要么手写 getXxx。PHP 8.4 的属性钩子能把「读的时候算一下」收进属性本身,类表面干净很多。
以前怎么写
真太阳时、节气、宫位名,调用处只想要一个值。我习惯藏进方法,结果业务代码全是 $pan->getTrueSolar()。看起来严谨,读起来吵。
class Pan {
private $longitude;
public function getTrueSolar() {
return $this->civil + $this->offset($this->longitude);
}
}
钩子怎么收
8.4 可以给属性写 get。外面仍然当属性用,里面该算还是算。注意钩子里不要再去读自己,会绕回去。
public int $trueSolar {
get => $this->civil + $this->offset($this->longitude);
}
我只改只读、无副作用的字段。带缓存、带写库的仍然用方法,钩子不是新的万能袋。
还要盯的
- 反射和
get_object_vars行为跟普通属性不完全一样,序列化前先测。 - 线上还停在 8.2 的项目先别跟。本站排盘接口已经在 8.4,才敢收这一批。
- IDE 提示有时滞后,以实际运行为准。
重构不是为了新语法。是调用处少一层括号,排盘对象读起来像一份盘,而不是一份 API 清单。