Autoloader函数尝试包含内置的PHP类

时间:2017-04-09 19:52:01

标签: php class autoloader

我已经为数据库操作创建了一个类。 该类继承自PDO类 使用该课程时会出现错误Fatal error: Class 'app\lib\PDO' not found 请注意,我使用了反斜杠\和PDO的继承。

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);
        }
    }
......

2 个答案:

答案 0 :(得分: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';
  }
});

答案 1 :(得分:0)

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

为了解决这个问题,您可以将其放在文件的顶部:

use \PDO;

或者您需要在每次使用\课程之前放置PDO。要了解有关命名空间的更多信息,请查看documentation

PDO是一个“普通”类,它有一个名称空间声明,如果你不在该名称空间中加载它,它将无法找到。就像任何其他类一样。在您的情况下,再次,您在app\lib命名空间中拥有它。因此,您必须在PDO命名空间中使用\PDO类,因为这是该类所在的命名空间。