PHP 8.4 的属性钩子我在主题里还没敢用
摘要
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,再来用属性钩子。现在用,等于把一半用户挡在门外。
2026年10月21日 11:41
前后30天 · 点日期看归档
9月21日
9月22日
9月23日
9月24日
9月25日
9月26日
9月27日
9月28日
9月29日
9月30日
10月1日
10月2日
10月3日
10月4日
10月5日
10月6日
10月7日
10月8日
10月9日
10月10日
10月11日
10月12日
10月13日
10月14日
10月15日
10月16日
10月17日
10月18日
10月19日
10月20日
10月21日
10月22日
10月23日
10月24日
10月25日
10月26日
10月27日
10月28日
10月29日
10月30日
10月31日
11月1日
11月2日
11月3日
11月4日
11月5日
11月6日
11月7日
11月8日
11月9日
11月10日
11月11日
11月12日
11月13日
11月14日
11月15日
11月16日
11月17日
11月18日
11月19日
11月20日