结论:错误源于PHP未加载PDO扩展,非代码错误;95%因扩展未安装、未启用或环境不一致导致。需用php -m确认pdo模块存在,检查php --ini路径下php.ini中extension=pdo是否启用,CentOS/RHEL还需安装php-pdo和php-mysqlnd包,重启对应服务(httpd/php-fpm),并区分CLI与Web环境配置差异。
直接说结论:这个错误不是代码写错了,是 PHP 运行时根本没加载
类——它压根不存在于当前 PHP 实例里。95% 的情况是扩展没装、没启、或启错环境了。
php
-m 看不到 pdo 模块
这是最常见也最容易确认的起点。执行命令后如果输出里没有
,说明扩展根本没生效。
先查你实际用的是哪个
:
,注意看 “Loaded Configuration File” 路径,别改错文件
打开那个
,搜索
—— 如果是注释状态(开头有分号),去掉分号;如果整行都没有,就手动加一行:
有些系统(如 CentOS/RHEL)把扩展拆成独立包,
核心和驱动是分开的,必须同时装:
(PHP 7/8)或
(较新版本)
改完配置后,必须重启 Web 服务(
或
),光重启 nginx 不够,它不直接管 PHP 扩展加载
phpinfo() 显示 PDO support enabled,但脚本仍报错
这说明 PHP CLI 和 Web SAPI 加载的是两套配置,你看到的
是 Apache/FPM 下的,而你在终端跑
看的是 CLI 的。
在 Web 页面里新建一个
,内容为
,访问它,重点看 “Loaded Configuration File” 和 “Additional .ini files parsed” 两栏
对比 CLI 的
输出,确认路径是否一致;如果不一致,Web 端可能读的是
这类碎片配置,要检查对应文件是否存在且内容正确
某些环境(如 cPanel、Plesk)会为每个站点生成独立的
或
,它们会覆盖全局配置,删掉或检查其中有没有禁用扩展的指令
用了命名空间却忘了 use PDO
虽然少见,但在现代 PHP 项目(尤其 Laravel、CakePHP)里容易踩坑:类名
被当成当前命名空间下的类,而不是全局的。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
错误写法:
在
下会尝试实例化
,当然找不到
正确写法:在文件顶部加
,或者直接用完整路径
注意:这个错误报的是
,不是
—— 如果报的是后者,说明问题不在命名空间
真正麻烦的点在于:同一个服务器上 CLI、Apache、FPM、甚至不同 vhost 可能用完全不同的
,而
和
显示的版本、扩展列表可能不一致。动手前先确认你调试的是哪一层的环境,否则改半天都是白忙。
PDOpdophp.iniphp --iniphp.iniextension=pdoextension=pdopdoyum install php-pdo php-mysqlnddnf install php-pdo php-mysqlndsystemctl restart httpdsystemctl restart php-fpmphpinfo()php -minfo.phpphp --ini/etc/php.d/10-pdo.ini.user.iniphp.iniPDOnew PDO(...)namespace App\DB;App\DB\PDOuse PDO;new \PDO(...)Class 'App\DB\PDO' not foundClass 'PDO' not foundphp.iniphp -vphpinfo()