php - 使用自定义自动加载器加载 php 核心类

标签 php autoloader spl-autoloader

我一直在论坛上搜索问题数据库,但找不到针对我的问题的解决方案。

我来找你,因为我怀疑我正在开发的自动加载器出现了问题。

重点是,当我尝试实例化我定义的类时,自动加载器工作正常,但是当我尝试实例化 PHP 核心的类时,会抛出以下错误。

例如,当我尝试这样做时:

$conn = new PDO (...);

然后抛出以下错误:

Fatal error: Class 'PDO' not found in ...

我注意到自动加载器正在尝试加载我已定义到我的类的路由的类。

我的问题是,如果我使用自定义自动加载器,如何加载 PHP 核心的类?

我希望您能指导我解决我遇到的这个问题。

预先非常感谢您。

请原谅我没有放置自定义自动加载器的代码,我错过了。

代码与 symfony 中使用的相同,但经过修改和简化。

class ClassLoader {

private $prefixes = array ();
private $fallbackDirs = array ();
private $useIncludePath = false;

public function getPrefixes  () {
    return $this->prefixes;
}

public function getFallbackDirs  () {
    return $this->fallbackDirs;
}

public function addPrefixes ( array $prefixes ) {
    foreach  ( $prefixes as $prefix => $path )  {
        $this->addPrefix ( $prefix, $path );
    }
}

public function addPrefix ( $prefix, $paths ) {
    if  ( !$prefix ) {
        foreach ( ( array ) $paths as $path ) {
            $this->fallbackDirs [] = $path;
        }
        return;
    }
    if  ( isset ( $this->prefixes [ $prefix ] ) ) {
        $this->prefixes [ $prefix ] = array_merge ( $this->prefixes [ $prefix ], ( array ) $paths );
    } else {
        $this->prefixes [ $prefix ] = ( array ) $paths;
    }
}

public function setUseIncludePath ( $useIncludePath ) {
    $this->useIncludePath = $useIncludePath;
}

public function getUseIncludePath () {
    return $this->useIncludePath;
}

public function register ( $prepend = false ) {
    spl_autoload_register ( array ( $this, 'loadClass' ) , true, $prepend );
}

public function unregister () {
    spl_autoload_unregister ( array ( $this, 'loadClass' ) );
}

public function loadClass ( $class ) {

    if  ( $file = $this->findFile ( $class ) ) {
        require $file;
        return true;
    }
}

public function findFile ( $class ) {
    if ( '\\' == $class [ 0 ]  )  {
        $class = substr ( $class, 1 );
    }
    if  ( false !== $pos = strrpos ( $class, '\\' ) ) {
        // namespaced class name
        $classPath = str_replace ( '\\', DIRECTORY_SEPARATOR, substr ( $class, 0, $pos ) ) . DIRECTORY_SEPARATOR;
        $className = substr ( $class, $pos + 1 );
    } else {
        // PEAR-like class name
        $classPath = null;
        $className = $class;
    }
    $classPath .= str_replace ( '_', DIRECTORY_SEPARATOR, $className ) . '.php';
    foreach ( $this->prefixes as $prefix => $dirs ) {
        if ( 0 === strpos ( $class, $prefix ) ) {
            foreach ( $dirs as $dir ) {
                if ( file_exists ( $dir . DIRECTORY_SEPARATOR . $classPath ) ) {
                    return $dir . DIRECTORY_SEPARATOR . $classPath;
                }
            }
        }
    }
    foreach ( $this->fallbackDirs as $dir ) {
        if ( file_exists ( $dir . DIRECTORY_SEPARATOR . $classPath ) ) {
            return $dir . DIRECTORY_SEPARATOR . $classPath;
        }
    }
    if ( $this->useIncludePath && $file = stream_resolve_include_path ( $classPath ) ) {
        return $file;
    }
}

}

但是如果你想查看原始文件在这里

https://github.com/symfony/symfony/blob/master/src/Symfony/Component/ClassLoader/ClassLoader.php

最佳答案

好吧,我的 friend 们。

我找到了没有加载PHP核心的PDO类的原因。

根据我的研究,我做了以下两件事之一:

或者在类实例处添加反斜杠

$conn = new \PDO (...);

或者将 PDO 类放在 use 子句中。

use api\ecobd\nucleo\Conexion, PDO;

我评论说我选择了第二个,因为第一个不起作用。

无论如何,感谢您提供的帮助,这对我更好地定位我的搜索以解决我的问题很有帮助:)

关于php - 使用自定义自动加载器加载 php 核心类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13465244/

相关文章:

PHP Autoloader 添加命名空间路径

php自动加载器: why does this work?

php password_verify() hash 和 pass 不匹配

php - 不在 MySQL 的 Codeigniter 中使用 LIKE 搜索我想要的内容

php - php 自动加载器是如何工作的

php - 使用 Composer 自动加载器时访问类时出错

php - 使用 PHP 将 TXT 文件中的行插入 SQL 数据库

php - UTF-8、PHP、Win7 - 现在有解决方案可以使用 php 在 Win 7 上保存 UTF-8 文件名吗?

PHP如何在类文件中包含 Composer 自动加载

php - 强制自动加载特定类