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 \
项目从 PHP 7.4 迁到 8.3,一开始以为只是改改配置,结果 error_log 刷了几百行。这篇把实际踩到的坑按「编译期致命 / 运行时告警 / 静默行为变化」三类整理出来,附上修改前后对比。一、先搞清楚哪些是「致命」,哪些只是「告警」升级前先做一件事:把所有代码跑一遍语法检查。find . -name "*.php" -not -path "./vendor/*" -print0 \
框架用久了容易把「容器」当黑盒。这篇从零写一个能用的 DI 容器,支持自动装配、单例复用、接口绑定和循环依赖检测,最后对齐 PSR-11 接口。一、容器到底解决了什么问题先看一段典型的「手工装配」代码:$pdo = new PDO($dsn, $user, $pass); $logger = new FileLogger('/var/log/app.log'); $mailer
「用 PDO 预处理就不会有注入」——这句话只对了一半。参数化能保护值,但保护不了标识符和结构。这篇把实际代码里反复出现的几个误区拆开讲。一、先明确预处理的边界PDO 预处理能安全处理的只有一种东西:值占位符。// 安全:值是参数 $stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?'); $stmt->execute([$email
很多人写了几年的 try...catch,但遇到 Fatal error 抓不住、Warning 又不知道去哪了。这篇把 PHP 的错误与异常体系从根上讲一遍,附一套可以直接用的全局处理器。一、先分清两套体系PHP 里「出问题」有两种完全不同的机制:错误(Error) —— 语言层面的问题。除零、类型不匹配、调用不存在的方法、语法错误。老版本里它们大多是 E_WARNING、E_NOTICE 这种
composer require 一行命令就能用别人的库,但 require 'vendor/autoload.php' 背后到底发生了什么?这篇把自动加载的链路拆开,顺便说清楚 PSR-4 的映射规则和几个常见坑。一、没有自动加载的时候每个类都要手写 require:require_once 'lib/Db.php'; require_once 'lib/UserRepository.php';