PHP 8.4 的属性钩子我在主题里还没敢用

· zblog · 阅读 1
摘要

php -v 我本机已经是 8.4 了。站能开,后台也能进。我把属性钩子的例子贴进主题试了一下,语法高亮还没反应过来,我就把文件退回去了。这东西现在不进我要给人用的主题。写法其实不长属性钩子是把读取和赋值写在属性旁边。我抄的是文档里那种 s

php -v 我本机已经是 8.4 了。站能开,后台也能进。我把属性钩子的例子贴进主题试了一下,语法高亮还没反应过来,我就把文件退回去了。这东西现在不进我要给人用的主题。

写法其实不长

属性钩子是把读取和赋值写在属性旁边。我抄的是文档里那种 set:

class ThemeMod {
    public string $logo {
        set {
            if ($value === '') {
                throw new ValueError('logo 不能是空的');
            }
            $this->logo = $value;
        }
    }
}

比单独写一个 setLogo() 短,也更好看。这点没啥好否认的。

卡我的是别人的 PHP

主题会发出去。我问过几个还在用这套主题的站,PHP 8.1、8.2 都有,8.3 已经算积极的。属性钩子是 8.4 的语法,旧版本在解析阶段就失败,不是跑到那一行才报错。function_exists 救不了语法。

非对称可见性也一样。public private(set) 这种写在 8.3 上同样过不了解析。我试过一次,错误是直接抛出来的,主题白屏。

我自己机器上会用的

array_find 和 array_any 我已经在本地脚本里用了。筛一组配置时,比手写 foreach 清楚:

$hit = array_find(
    $mods,
    fn ($item) => $item['id'] === $current
);

提交到主题仓库之前我会改回普通循环。这两个函数也是 8.4 才有。readme 里我还写着最低 php 8.1,改一行语法填不上这个坑。

等我真把运行环境锁死在 8.4,再来用属性钩子。现在用,等于把一半用户挡在门外。