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 PDO或new \PDO它会加载全局PDO类,但它似乎没有工作?
在Namespaced PHP中,对类的引用必须包含该类的名称空间,除非您有一个use包含该类或其名称空间的一部分的语句.
因此,如果您没有use声明,那么必须使用前导反斜杠引用PDO和其他全局类 - 即$obj = new \PDO();
如果您有一个use引用该类的语句,那么您可以仅通过类名引用它:
use PDO;
....
$obj = new PDO();
Run Code Online (Sandbox Code Playgroud)
如果你引用了很多全局类,那么use如果你想避免每次都使用反斜杠,你就需要单独使用它们.
| 归档时间: |
|
| 查看次数: |
6510 次 |
| 最近记录: |