我已经关注了类,并且添加 setAttribute 后 initPDO 失败
namespace DBInterface;
class DBInterface {
protected function initPDO() {
$dsn = sprintf('sqlsrv:Server=%s;Database=%s', DB_SQL_SERVERNAME, DB_DB_NAME);
$this->obPDO = new \PDO($dsn, DB_SQL_USERNAME, DB_SQL_PASSWORD);
$this->obPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
}
这会导致 PHP 错误:
Could not find class file: DBInterface/PDO in root lib directory nor build lib path
Trace: [file] => path\lib\DBInterface\DBInterface.php
[line] => 23
[function] => __autoload
[args] => Array
(
[0] => DBInterface\PDO
)
你看到了什么愚蠢的东西吗?我无法弄清楚oO。 第 23 行指向 setAttribute 方法。
最佳答案
您只是遇到了命名空间问题。 PDO
存在于根命名空间中,因此您的常量开头需要有一个反斜杠。就像您对 new\PDO
所做的那样。
$this->obPDO->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
如果没有反斜杠,PHP 会在您的 DBInterface
命名空间中查找 PDO
。正如您在错误中看到的,它正在查找不存在的 DBInterface\PDO
。
关于PHP 命名空间的奇怪行为。调用PDO方法又触发__autoload?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20079609/