PHP试图使用自动加载函数来查找PDO类

Posted

技术标签:

【中文标题】PHP试图使用自动加载函数来查找PDO类【英文标题】:PHP trying to use autoload function to find PDO class 【发布时间】:2013-07-28 09:53:54 【问题描述】:

这已经困扰我一段时间了,我似乎无法理解它。

我的 phpinfo 报告 PDO 已安装,我可以通过 index.php 文件连接到我的数据库。但是当我尝试在命名空间类上打开 PDO 连接时,php 正在尝试使用我的自动加载函数来查找不起作用的 PDO.php。

我的班级如下:

abstract class 

    protected $DB;

    public function __construct()
    
        try   
          $this->DB = new PDO("mysql:host=$host;port=$port;dbname=$dbname", $user, $pass);
          
        catch(PDOException $e)   
            echo $e->getMessage();  
        
    

错误是

Warning: require_once((...)/Model/PDO.php): failed to open stream: No such file or directory in /(...)/Autoloader.php

Fatal error: require_once(): Failed opening required 'vendor/Model/PDO.php' (include_path='.:/Applications/MAMP/bin/php/php5.4.4/lib/php') in /(...)/Autoloader.php

据我所知,应该调用自动加载器,因为安装了 PHP PDO 扩展(是的,我完全确定)。

我的自动加载如下:

spl_autoload_register('apiv2Autoload');

/**
 * Autoloader
 * 
 * @param string $classname name of class to load
 * 
 * @return boolean
 */
function apiv2Autoload($classname)

    if (false !== strpos($classname, '.')) 
        // this was a filename, don't bother
        exit;
    

    if (preg_match('/[a-zA-Z]+Controller$/', $classname)) 
        include __DIR__ . '/../controllers/' . $classname . '.php';
        return true;
     elseif (preg_match('/[a-zA-Z]+Mapper$/', $classname)) 
        include __DIR__ . '/../models/' . $classname . '.php';
        return true;
     elseif (preg_match('/[a-zA-Z]+Model$/', $classname)) 
        include __DIR__ . '/../models/' . $classname . '.php';
        return true;
     elseif (preg_match('/[a-zA-Z]+View$/', $classname)) 
        include __DIR__ . '/../views/' . $classname . '.php';
        return true;
    

有什么帮助吗?

【问题讨论】:

你确定你没有在命名空间内调用new PDO(),这使得自动加载器寻找\some\namespace\PDO类? $this->DB = new \PDO(...); 【参考方案1】:

这不是真正的自动加载问题。您正在尝试调用根命名空间上的类。

从外观上看,您在某个“模型”命名空间中并调用PDO,您必须记住namespaces are relative by default。

你想要的是要么调用绝对路径:

\PDO

或在文件顶部说您将像这样使用 PDO:

use PDO;

【讨论】:

是的。这样就彻底解决了。为了一致性而选择了第二种形式。愚蠢的错误。谢谢 +1:也许 OP 会很感激你给你一个赞成票或可能接受答案。 是的...不能投票,因为我需要 15+ 声望。但我很感激:)

以上是关于PHP试图使用自动加载函数来查找PDO类的主要内容,如果未能解决你的问题,请参考以下文章

Composer 自动加载自定义类

类的自动加载

php使用命名空间时自动加载机制

PHP - 重置自动加载和声明的类

__autoload()

php自动加载带命名空间类的函数