【问题标题】:PHP Namespaces strange behaviour. Calling PDO method and __autoload is trigerred again?PHP 命名空间奇怪的行为。调用 PDO 方法并再次触发 __autoload?
【发布时间】:2013-12-03 11:33:34
【问题描述】:

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

【问题讨论】:

    标签: php pdo namespaces autoload


    【解决方案1】:

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

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

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

    【讨论】:

    • 你也可以使用'use PDO;'将类“导入”到当前命名空间中。
    • 那真是愚蠢。我错误地认为这是一个常数,所以我没有添加 /。
    猜你喜欢
    • 2014-01-24
    • 1970-01-01
    • 2012-08-26
    • 2012-04-20
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    相关资源
    最近更新 更多