PHP 在全局命名空间中使用类

标签 php pdo namespaces autoload

我有一个使用 PDO 的 DB 包装类,在构造函数中我创建了一个 PDO 对象。包装器类在我们的命名空间中,我们正在使用自动加载器。问题是在我们的命名空间中找不到 PDO 类,因此我尝试使用全局命名空间,如 here 所述.

//Class file
namespace Company\Common;
class DB {
    private function __construct(){
        $this->Handle=new PDO(...);
    }
}

有了这个,我得到了这个(如预期的那样):

Warning: require(...\vendors\Company\Common\PDO.class.php): failed to open stream

如果我这样做:

namespace Company\Common;
use PDO;

我明白了:

Fatal error: Class 'DB' not found in ...\includes\utils.php

而 utils.php 在错误行中包含此内容,在实现命名空间之前它工作正常:

DB::getInstance();

或者我试过这个:

namespace Company\Common;
class DB {
    private function __construct(){
        $this->Handle=new \PDO(...);
    }
}

它试图像最初那样在我们的命名空间中加载 PDO 类。

我该如何解决这个问题?我想通过 use PDOnew\PDO 它会加载全局 PDO 类,但它似乎不起作用?

最佳答案

在命名空间 PHP 中,对类的引用必须包含该类的命名空间,除非您有包含该类或其命名空间的一部分的 use 语句。

因此,如果您没有针对它的use 语句,则必须使用前导反斜杠引用 PDO 和其他全局类——即 $obj = new\PDO();

如果您有一个引用该类的use 语句,那么您可以仅通过类名来引用它:

use PDO;
....
$obj = new PDO();

如果您引用了很多全局类,如果您想避免每次都使用反斜杠,则需要单独使用它们中的每一个。

关于PHP 在全局命名空间中使用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14282011/

相关文章:

php - 如何将 pdo 的准备好的语句用于 order by 和 limit 子句?

php - 多个管理员的 Codeigniter 角色

php - Get_the_terms - 显示所有帖子类型

php - UTF-8贯穿始终

php - PDO Sqlite 一般错误 : 25 bind or column index out of range

php - 从表中删除变量不起作用

r - 光栅包绘图函数的命名空间问题?

c# - 两个具有相同名称的类可以跨两个不同的程序集位于同一个命名空间中吗?

JavaScript 窗口命名空间 - 我可以深入了解一下它在做什么吗?

php - SQL PHP 在同一查询中选择具有多个条件的列