2

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

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

关键是,当我尝试实例化一个由我定义的类时,自动加载器工作正常,但是当我尝试实例化 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

4

2 回答 2

3

好吧,我的朋友们。

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

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

或者在类实例的时候放一个反斜杠

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

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

use api\ecobd\nucleo\Conexion, PDO;

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

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

于 2012-11-20T16:28:50.777 回答
2

检查是否已加载 PDO 扩展并且 PDO 是否可以在未注册您的自动加载器的情况下工作。自动加载器不应影响核心类,并且您不需要自动加载器来加载核心类。

于 2012-11-20T01:31:08.550 回答