PHP编程难题不在于语言,而在于如何巧妙运用?

摘要:PHP 的问题不在语言本身,而在我们怎么写它 代码库烂了不是语言的锅,是赶工和惯性。 PHP 的口碑,几乎在每次技术讨论中都会被拎出来。应用慢、乱、不安全、改起来痛苦?总有人耸耸肩说:"嗯……毕竟是 PHP 嘛。&
PHP 的问题不在语言本身,而在我们怎么写它 代码库烂了不是语言的锅,是赶工和惯性。 PHP 的口碑,几乎在每次技术讨论中都会被拎出来。应用慢、乱、不安全、改起来痛苦?总有人耸耸肩说:"嗯……毕竟是 PHP 嘛。" 这话很少出于技术判断,更像是一种习惯性甩锅。 事实比这简单,也更扎心:大多数 PHP 系统之所以难维护,是我们自己放任的结果。PHP 不会一上来就逼你做架构设计、划边界、守规矩。它很宽容,很务实,特别擅长让你把一个“能跑就行”的东西赶出来。 但今天能跑的代码库,明天可能就是灾难。 一个 PHP 项目沦为恐怖故事,很少是因为 PHP 做不到更好,而是团队从来没养成那些能让项目越做越大还不崩的习惯——结构、测试、约定、关注点分离。 现代 PHP 完全有能力做到: 严格类型(是的,真正的类型) 整洁架构 依赖注入 表达力强的领域模型 规范的错误处理 可靠的测试 高性能(OPcache/JIT、缓存、合理的 I/O) 成熟的工具链 如果你对 PHP 的印象还停留在"到处 include 文件"和"在视图里写 SQL",那你骂的不是 PHP 这门语言,而是一种早该被淘汰的 PHP 写法。 这篇文章不是在给 PHP 洗地,只是想说清楚一件事:PHP 是一面镜子,照出来的是你的工程文化。照出来不好看,换面镜子也没用。 PHP 很宽容——宽容的语言会放大你的习惯 有些语言生态从一开始就逼你把结构搭好。想做稍微复杂一点的东西,就绕不开包、模块、接口、依赖注入这些概念,哪怕你没主动要求,约束也自动就在那了。 PHP 的玩法不一样: 可以从一个文件起步 可以毫无阻力地混合各层 可以在任何地方访问全局变量 可以在控制器里直接查数据库 可以忽略类型照样上线 这种灵活性本身不是坏事,PHP 靠它当了多年 Web 开发的默认选择。但它也埋了一个坑:结构显得可有可无,而可有可无的东西在赶工时一定会被砍掉。 很多“PHP 太烂了”的故事,背后的真实剧情是“赶工期上了线,然后重构的债一直没还”。 PHP 没有造成这个问题,它只是没有阻止。 "都怪 PHP"往往是在逃避责任 系统让人痛苦的时候,甩锅给语言最省事,因为语言最容易看到。真正的原因往往藏得更深: 没有统一的编码规范 没有架构负责人 没有测试 没有为重构分配时间 代码评审时松时紧 "先交付再说"的激励机制 这些问题哪个技术栈都有。区别在于 PHP 能让你在几乎没有约束的情况下把项目推得很远,技术债悄悄攒着——然后在某一天集中爆发。 PHP 成了替罪羊,因为承认流程烂了,比甩锅给语言难多了。 现代 PHP 不是你记忆中的 PHP 如果你对 PHP 的认知还停在"PHP 5 加一堆随意 include"的年代,那你错过的东西太多了: declare(strict_types=1); 标量类型和返回类型 类型化属性 联合类型 枚举 属性注解(Attributes) 更好的错误语义 Composer 成为标配 PSR 标准 优秀的框架(Laravel、Symfony)和组件 静态分析工具(PHPStan/Psalm) 代码格式化工具(PHP-CS-Fixer) 容器化 / CI 工作流 语言进化了,但很多团队没有。 所以真正的问题是:你写 PHP 的时候,是把它当成一门现代后端语言,还是当成赶工时凑合用的脚本? 经典 PHP 反模式:"什么都塞进控制器" 下面这套流程,在很多项目里都能看到: 控制器接收请求 控制器做验证 控制器拼查询 控制器处理业务规则 控制器更新数据库 控制器格式化响应 控制器触发副作用(邮件、队列) 能跑,能上线,功能还能往上堆。然后就开始变脆——因为控制器已经变成了一个揽了业务规则、数据持久化和 I/O 的上帝对象。 看一个简化版的例子。
阅读全文