Php 使用名称空间自动加载PDO

Php 使用名称空间自动加载PDO,php,pdo,namespaces,autoload,Php,Pdo,Namespaces,Autoload,在我的PHP项目中有一个名为DB的类,其中包含以下代码: namespace classes\utility; use \PDO; class DB { /*object constructor*/ # connect to database private function __construct() { try { $conn = new PDO('sqlsrv:Server=' . DB_HOS

在我的PHP项目中有一个名为DB的类,其中包含以下代码:

namespace classes\utility;

use \PDO;

class DB
{

    /*object constructor*/      # connect to database
    private function __construct()
    {
        try
        {
            $conn = new PDO('sqlsrv:Server=' . DB_HOST . ';Database=' . DB_NAME);
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);     //to capture error messages returned by db
            $this->setPdo($conn);
            // echo 'connected';    //enable this line to test db connection
        }
        catch(PDOException $e)
        {
            die($e->getMessage());
        }
    }
以下自动加载器位于index.php中:

# autoload classes (this uses an anonymous function)
spl_autoload_register(function($className) {
        // echo $className . '<br>';
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strrpos($className, '\\')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
        // echo '<br>autoload: ' . $fileName . '<br>';
    require $fileName;
});
#自动加载类(使用匿名函数)
spl_自动加载_寄存器(函数($className){
//回显$className。“
”; $className=ltrim($className,'\\'); $fileName=''; $namespace=''; 如果($lastnpsos=strrpos($className,'\\')){ $namespace=substr($className,0,$lastnpsos); $className=substr($className,$lastnpspos+1); $fileName=str\u replace('\\',目录分隔符,$namespace); } $fileName.=str_replace(“_”,目录分隔符,$className)。'.php'; //回显“
自动加载:”.$fileName.“
”; 需要$fileName; });
对DB类进行这些修改时:remove
use\PDO
并在PDO构造函数前面加一个反斜杠,如so
$conn=new\PDO('sqlsrv:Server='.DB_HOST.';Database='.DB_NAME)这篇文章中推荐的:然后代码失败。这些信息是:
警告:require(classes\utility\PDO.php):无法打开流:第40行的C:\xampp\htdocs\MyProject\OOP\index.php中没有此类文件或目录

致命错误:require():无法在第40行打开C:\xampp\htdocs\MyProject\OOP\index.php中所需的“classes\utility\PDO.php”(include_path=';C:\xampp\php\PEAR)


为什么这样不行?我希望排除use语句,并通过在PDO构造函数中使用反斜杠让PHP自动加载PDO。

Hi。如果要删除use指令,则需要在出现任何PDO之前添加反斜杠,其中包括下一行中的所有PDO::代码。我们还需要更多的代码才能达到100%的准确度。@Thomas-我尝试过添加反斜杠,比如
$conn->setAttribute(\PDO::ATTR\u ERRMODE,\PDO::ERRMODE\u EXCEPTION)但仍然得到相同的结果。我还尝试在PDOException前面添加一个反斜杠(不确定是否属于该异常),但没有效果。我错过了什么?另外,需要添加更多的代码以达到100%的准确率意味着什么?我想明白了。上面为DB类发布的代码只是该类的一部分。类后面的query()方法中有一个PDO::也需要反斜杠。在PDOException之前不需要反斜杠。我认为没有理由删除
use\PDO
(事实上,我想说的是将它改为
use\PDO\PDOException;
。至少这意味着你不必去寻找所有不带前缀的用法。