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

Jas*_*sky 2 php pdo namespaces autoload

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

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

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

Warning: require(...\vendors\Company\Common\PDO.class.php): failed to open stream
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

namespace Company\Common;
use PDO;
Run Code Online (Sandbox Code Playgroud)

我明白了:

Fatal error: Class 'DB' not found in ...\includes\utils.php
Run Code Online (Sandbox Code Playgroud)

而utils.php在错误行中包含这个,在实现名称空间之前工作正常:

DB::getInstance();
Run Code Online (Sandbox Code Playgroud)

或者我试过这个:

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

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

我该如何解决这个问题?我想通过这样做use PDOnew \PDO它会加载全局PDO类,但它似乎没有工作?

SDC*_*SDC 5

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

因此,如果您没有use声明,那么必须使用前导反斜杠引用PDO和其他全局类 - 即$obj = new \PDO();

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

use PDO;
....
$obj = new PDO();
Run Code Online (Sandbox Code Playgroud)

如果你引用了很多全局类,那么use如果你想避免每次都使用反斜杠,你就需要单独使用它们.