我有一个小的数据库类,我正在尝试使用PDO
连接到我的数据库,但出现此错误:
致命错误:未捕获的错误:在/var/www/html/app/lib/DB.php:11中找不到类'app \ lib \ PDO'
我已使用此代码检查PDO
是否启用:
if ( extension_loaded('pdo_mysql') ) {
exit('yes');
}
并且输出为“是”。
我也检查了我的php.ini
,但我确实有这行(没有半列):
extension=pdo_mysql
这是我的DB.php
代码:
namespace app\lib;
class DB{
private static $instance = null;
public $pdo;
private function __construct(){
try {
$this->pdo = new PDO('mysql:host=127.0.0.1;dbname=db', 'user', 'password');
} catch (PDOException $e) {
exit($e->getMessage());
}
}
public static function instance(){
if(!isset(self::$instance)){
self::$instance = new self();
}
return self::$instance;
}
}
这是我的自动加载器(init.php
)文件:
define('DS', DIRECTORY_SEPARATOR);
spl_autoload_register(function($namespace){
$path = dirname(__FILE__) . DS . str_replace('\\', DS, $namespace . '.php');
if(file_exists($path)){
require_once $path;
}
});
这是我尝试设置新的DB
连接的方法:
require_once 'init.php';
$db = app\lib\DB::instance();
P.S:如果我不使用名称空间并使用过程代码,则Pdo可以工作:
try {
$pdo = new PDO('mysql:host=127.0.0.1;dbname=db',
'user', 'password');
} catch (PDOException $e) {
exit($e->getMessage());
}
如果我不使用名称空间,Pdo会起作用
这是解决方案的关键。 PDO
是PHP中的类。所有类名都应完全限定,否则PHP将仅在当前名称空间中查找该类的定义。要在除全局名称空间以外的任何其他名称空间中使用PDO,您需要借助单个\
$this->pdo = new \PDO('mysql:host=127.0.0.1;dbname=db', 'user', 'password');
旁注。建议不要使用创建PDO实例的方式。您应该指定字符集并启用PDO错误报告。
$this->pdo = new \PDO('mysql:host=127.0.0.1;dbname=db;charset=utf8mb4', 'user', 'password', [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_EMULATE_PREPARES => false,
]);
从不捕获异常,仅对die/exit
。让异常冒出来,或者正确处理它们。手动向用户显示错误消息是潜在的安全问题。