×

文章
2025.02.16

PHP 8.4 属性钩子,我把一堆 getter 收了

2 分钟读完 2831 次阅读 PHP PHP 8.4 重构

排盘对象里有不少只读字段,以前要么写成 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 清单。