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

标签 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 方法。

最佳答案

您只是遇到了命名空间问题。 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/

相关文章:

php - 如何用其他单词替换以@@ 开头并以@@ 结尾的文本中的单词?

php - 插入...重复 key 更新(PHP : PDO)

PHP PDO 按列名分组查询结果

php - 在递归函数 php 中重新启动第一个循环

.net - 当类名不明确时可以指定优先命名空间吗?

PHP preg_match "AND"运算符

php - Paypal SSL 错误

php - 如何遍历 PHP DOMDocument 标签下的所有 Childs

php - Codeigniter 自定义库和命名空间

c# - VS2012 Project Xaml 报告找不到命名空间错误,但项目编译正常