PHP 8.1 / 8.2 / 8.3 升级踩坑实录:从 7.4 到 8.3 我改了哪些代码

项目从 PHP 7.4 迁到 8.3,一开始以为只是改改配置,结果 error_log 刷了几百行。这篇把实际踩到的坑按「编译期致命 / 运行时告警 / 静默行为变化」三类整理出来,附上修改前后对比。一、先搞清楚哪些是「致命」,哪些只是「告警」升级前先做一件事:把所有代码跑一遍语法检查。find . -name "*.php" -not -path "./vendor/*" -print0 \

用反射手写一个依赖注入容器(PSR-11 实现)

框架用久了容易把「容器」当黑盒。这篇从零写一个能用的 DI 容器,支持自动装配、单例复用、接口绑定和循环依赖检测,最后对齐 PSR-11 接口。一、容器到底解决了什么问题先看一段典型的「手工装配」代码:$pdo = new PDO($dsn, $user, $pass); $logger = new FileLogger('/var/log/app.log'); $mailer

PDO 预处理不是万能药:几个真实场景下的 SQL 注入误区

「用 PDO 预处理就不会有注入」——这句话只对了一半。参数化能保护值,但保护不了标识符和结构。这篇把实际代码里反复出现的几个误区拆开讲。一、先明确预处理的边界PDO 预处理能安全处理的只有一种东西:值占位符。// 安全:值是参数 $stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?'); $stmt->execute([$email

把 PHP 的错误处理捋清楚:Error、Exception 和 Throwable 到底什么关系

很多人写了几年的 try...catch,但遇到 Fatal error 抓不住、Warning 又不知道去哪了。这篇把 PHP 的错误与异常体系从根上讲一遍,附一套可以直接用的全局处理器。一、先分清两套体系PHP 里「出问题」有两种完全不同的机制:错误(Error) —— 语言层面的问题。除零、类型不匹配、调用不存在的方法、语法错误。老版本里它们大多是 E_WARNING、E_NOTICE 这种