
在自定义命名空间(如 server)中直接使用 new PDO() 会导致“Class not found”错误,因为 PHP 会尝试在当前命名空间下查找 server\PDO;正确做法是使用全局命名空间前缀 \PDO 或显式 use PDO。
在自定义命名空间(如 `server`)中直接使用 `new pdo()` 会导致“class not found”错误,因为 php 会尝试在当前命名空间下查找 `server\pdo`;正确做法是使用全局命名空间前缀 `\pdo` 或显式 `use pdo`。
当你在 PHP 文件顶部声明了 namespace server;(例如在 dbcon.php 中),PHP 就会将所有未加限定的类名(如 PDO、Exception、stdClass)默认解析为当前命名空间下的类,即 server\PDO —— 而这显然不存在,因为 PDO 是 PHP 的内置全局类。
✅ 正确解决方案有以下两种(推荐第一种):
✅ 方案一:使用全局命名空间前缀 \PDO(最清晰、无歧义)
namespace server;
// ... env 类定义保持不变 ...
// 在连接数据库时:
try {
$data_source = "mysql:host=" . $SERVER_NAME . ";dbname=" . $DBNAME;
$db = new \PDO($data_source, $USERNAME, $PASSWORD); // ← 注意开头的反斜杠!
$db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); // 同样需加 \
echo "Connected successfully\n";
} catch (\PDOException $ex) { // ← 异常类也需全局引用
die("Connection failed: " . $ex->getMessage());
}
✅ 方案二:使用 use 导入全局类(提升可读性,适合多处调用)
namespace server;
use PDO; // 导入全局 PDO 类
use PDOException; // 导入全局异常类
// ... 其他代码 ...
try {
$db = new PDO($data_source, $USERNAME, $PASSWORD); // 现在可直接使用
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $ex) {
die("Connection failed: " . $ex->getMessage());
}
⚠️ 重要注意事项:
-
.env文件格式应为纯键值对,不要加引号和逗号(否则explode('=', $line)会解析失败):
❌ 错误写法:DB_SERVER_NAME="localhost",
✅ 正确写法:DB_SERVER_NAME=localhost - 确保 PHP 已启用
pdo_mysql扩展(通过php -m | grep pdo验证),否则即使语法正确也会报“Class 'PDO' not found”。 - 建议始终设置
PDO::ATTR_ERRMODE为PDO::ERRMODE_EXCEPTION,便于统一捕获数据库异常。
? 总结:只要在命名空间内使用任何 PHP 内置类(如 PDO、DateTime、Exception、ArrayObject 等),就必须显式指定其全局路径(\ClassName)或通过 use 导入。这是 PHP 命名空间机制的基本规则,而非 PDO 特有问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











