Autoloader 函数试图包含一个内置的 PHP class

Autoloader function tries to include a built-in PHP class

我创建了一个 class 用于数据库操作。 此 class 继承自 PDO class。
使用 class 时出现错误 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);
        }
    }
......

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

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

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

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

use \PDO;

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

PDO是一个"normal"class,它有一个命名空间声明,如果你不在那个命名空间内加载它,它不会被发现。就像任何其他 class。同样,在您的情况下,您将它放在 app\lib 命名空间中。因此,您必须在 \PDO 命名空间中使用 PDO class,因为那是 class 所在的命名空间。