高质量thinkphp代码依赖可验证规则而非经验:命名须严格大小写一致、控制器仅转发请求、模型专注数据映射、配置分层隔离。

ThinkPHP 高质量代码不是靠“写得快”堆出来的,而是靠命名、结构、边界和约束一层层压出来的。它不依赖个人经验,而依赖可验证的规则——比如文件名和类名大小写不一致,在 Linux 服务器上直接 Class not found;比如模型里混写 SQL 拼接,在并发场景下秒变注入入口。
类与文件命名必须严格大小写一致
ThinkPHP 在调试模式下(哪怕在 Windows)也会校验大小写,生产环境部署到 Linux 后,大小写错一个字母就触发 ClassNotFoundException。这不是警告,是硬性失败。
-
UserController.class.php文件里必须定义UserController类,不能是usercontroller或Usercontroller - 命名空间路径必须和目录结构完全匹配:
app\index\controller\User对应app/index/controller/User.php(TP6+ 已去.class.php后缀),大小写一个都不能差 - 模块名、控制器名、方法名全部参与路由解析,
Index/index和index/index是两个不同路由
控制器只做请求转发,不做业务判断
把 if、foreach、数据库查询、第三方调用塞进控制器,等于把所有脏活累活都绑死在请求入口。一旦需求变更,改一处,测十处。
- 控制器方法体应控制在 15 行以内,只负责接收参数、调用服务层、返回结果(
json或视图) - 禁止在控制器中直接调用
Db::table()、new UserModel()、file_get_contents()等产生副作用的操作 - 参数校验必须走
Validate类或think-validate扩展,而不是手写empty()+isset()判断
模型专注数据映射,拒绝逻辑污染
模型不是“万能工具箱”,它的职责边界非常清晰:字段定义、关联配置、自动完成/过滤、软删除。任何跟“计算”“决策”“通知”沾边的代码,都不该出现在模型里。
- 禁止在
protected $auto或protected $filter里调用外部 API 或写日志 - 关联定义(
hasOne、hasMany)必须用闭包方式显式声明表名和外键,避免框架隐式推导出错 - 敏感字段如
password必须在protected $hidden = ['password']中声明,不能靠前端不传就心存侥幸
配置、常量、环境变量命名必须分层隔离
混淆 APP_DEBUG(环境变量)、HTML_CACHE_ON(配置项)、HAS_ONE(常量)三者,会导致运行时行为不可控,尤其在多环境部署时。
- 环境变量全大写 + 下划线,仅用于启动时开关(如
APP_ENV=prod、REDIS_HOST=127.0.0.1) - 配置项小写 + 下划线,通过
config('database.hostname')读取,禁止硬编码数据库地址或密钥 - 常量全大写 + 下划线,只用于固定语义标识(如
THINK_VERSION、SQL_BUILD),不参与运行时计算
Log::write(),比如把密码哈希逻辑扔进模型的 setPasswordAttr。这些看似省事的点,正是后期排查 500 错误、修复并发数据错乱、应对安全审计时最耗神的地方。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











