PHP命名空间奇怪的行为。再次触发调用PDO方法和__autoload?

时间:2013-11-19 18:49:25

标签: php pdo namespaces autoload

在添加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方法。

1 个答案:

答案 0 :(得分:3)

您只有一个命名空间问题。根名称空间中存在PDO,因此在常量的开头需要反斜杠。就像使用new \PDO一样。

$this->obPDO->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

没有反斜杠,PHP正在PDO命名空间中寻找DBInterface。正如您在错误中看到的那样,它会查找不存在的DBInterface\PDO