2017-04-09 32 views
0

我已经创建了一个用于数据库操作的类。 该类继承自PDO类。
使用该类时出现错误Fatal error: Class 'app\lib\PDO' not found
请注意,我使用了带有PDO继承的反斜杠\自动加载器功能试图包含一个内置的PHP类

class Database extends \PDO { 

    private static $object; 
    private static $pdo; 

    function __construct() { 
     $db_config = Config::getItem('database'); 
     try { 
      $dsn = "mysql:host=" . $db_config['db_host'] . ";dbname=" . $db_config['db_name'] . ";charset=" . $db_config['db_charset'] . ""; 
      parent::__construct($dsn, $db_config['db_username'], $db_config['db_password']); 
     } catch (\PDOException $err) { 
      trigger_error($err->getMessage(), E_USER_ERROR); 
     } 
    } 
...... 
+0

,而不是把'在文件 – MoeinPorkamel

+0

@Nytrix的顶部使用\ PDO'也许他用PDO在另一放置在其文件中。 – MoeinPorkamel

+0

是的,其实@MoeinPorkamel是正确的。这不是'extend \ PDO',那是好的。因为当你加载'PDO'时,你仍然在命名空间'app \ lib'中。正如你在错误中看到的那样。该类不存在于该名称空间中。 – Nytrix

回答

0

您尝试过在中加载PDO错误的命名空间。这不在我们介绍的代码中。正如您在错误Fatal error: Class 'app\lib\PDO' not found中看到的,它会尝试在名称空间app\lib中加载PDO类。您可能知道,它不在该名称空间中。

为了解决这个问题,你可以把这个文件的顶部:

use \PDO; 

或者你需要把\PDO类的每次使用之前。要了解更多关于命名空间的信息,请查看documentation

PDO是一个“正常”类,它有一个名称空间声明,如果您不在该名称空间中加载它,它将不会被找到。就像任何其他班级一样。在你的情况,再次,你在app\lib命名空间。所以,你必须使用\PDO命名空间中的类PDO,因为那是类是在什么命名空间。

+0

谢谢,'use \ PDO'正常工作。但我知道你在你的类中使用这个语句,而不是内置的类。 –

+0

@LionKing这是因为你在'app \ lib'的命名空间中,并且'PDO'类在该命名空间中不是**。我希望这是有道理的。它位于基本'\'命名空间中,而不是'app \ lib'。这就是你为什么要做'use \ PDO'的原因。另外,“PDO”不过是一个类。 – Nytrix

+0

我想是因为我在'app \ lib'命名空间中,当从PDO继承时,我使用了'\ PDO',那么对于全局命名空间使用反斜杠有什么好处。 –

0

您可以通过检查文件是否存在解决这个问题,这里是一个通用的代码,你可以在所有自动加载的情况下使用,且无需对“\”

spl_autoload_register(function($class){ 
    if(file_exists(SITE_PATH . 'app/classes/'. $class .'.php')){ 
    require_once SITE_PATH . 'app/classes/'. $class .'.php'; 
    }elseif(file_exists(SITE_PATH . 'app/another-folder/'. $class .'.php')){ 
    require_once SITE_PATH . 'app/another-folder/'. $class .'.php'; 
    } 
}); 
+0

不,这不是问题。这不是一个加载问题,这是一个namspace问题。 – Nytrix

+0

@Nytrix我猜问题标题误导 –