INSIDE THE STORY
PHP 7.4 时代的轻量 CMS 实践
在很多技术讨论里,PHP 似乎总是被当作“上一个时代”的选择。但如果你要做的是一款部署在普通虚拟主机、由个人长期维护的内容系统,它依然是非常务实的基础设施。
## 薄框架,不等于没有结构
不使用 Laravel 这样的全栈框架,并不意味着把代码都写进一个 `index.php`。相反,越小的系统,越需要清楚的分层:
- **入口层**:负责路由、会话、错误处理。
- **领域层**:文章、分类、评论、媒体,各自拥有明确的职责。
- **接口层**:后台通过 JSON API 与前端交互,而不是直接渲染页面。
- **呈现层**:前台主题与后台界面彼此独立。
这样的结构没有魔法,但每一层都可以被单独理解和替换。
## 兼容 PHP 7.4 的几个细节
宝塔面板上仍有大量 PHP 7.4 环境。为了保证兼容,需要刻意避开一些新语法:
- 不使用 `match`、构造器属性提升、`str_contains`;
- 不依赖枚举与只读属性;
- 对 `PDO` 的返回类型保持宽容,因为不同驱动可能返回字符串;
- 时间计算尽量交给 PHP,而不是数据库方言函数。
> 兼容性不是保守,而是对部署环境的尊重。
## 数据库只做它擅长的事
内容系统的大部分查询都很简单。真正需要小心的是分页、搜索与关联数据:
1. 分页参数必须强制转为整数,避免把用户输入拼进 SQL;
2. 标签、分类使用关联表,避免在文章表里存逗号分隔的 ID;
3. 列表页一次性取回标签,避免 N+1 查询;
4. 所有写入使用预处理语句,并统一时间格式。

## 安全是默认值
后台登录、CSRF、上传校验、输出转义,这些不应该等到上线前才补。把它们做成基础设施的一部分,后续每加一个功能,都会自然继承这些保护。
轻量不是省掉安全,而是让安全足够简单,简单到不会忘记。