我有一个使用 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 PDO
或 new\PDO
它会加载全局 PDO 类,但它似乎不起作用?
最佳答案
在命名空间 PHP 中,对类的引用必须包含该类的命名空间,除非您有包含该类或其命名空间的一部分的 use
语句。
因此,如果您没有针对它的use
语句,则必须使用前导反斜杠引用 PDO 和其他全局类——即 $obj = new\PDO();
如果您有一个引用该类的use
语句,那么您可以仅通过类名来引用它:
use PDO;
....
$obj = new PDO();
如果您引用了很多全局类,如果您想避免每次都使用反斜杠,则需要单独使用
它们中的每一个。
关于PHP 在全局命名空间中使用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14282011/