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クラスをロードしなかった理由がわかりました。

私の調査によると、私は次の2つのいずれかを行います。

または、クラスインスタンスのときにバックスラッシュを入れます

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

または、PDOクラスをuse句に入れます。

use api\ecobd\nucleo\Conexion, PDO;

最初のものが機能しなかったので、私は2番目のものを選んだとコメントしました。

とにかく与えられた助けに感謝し、私の問題を解決するために私の検索をよりよくターゲットにするために私をうまく助けました:)

于 2012-11-20T16:28:50.777 に答える
2

PDO 拡張機能がロードされているかどうか、オートローダーを登録せずに PDO が動作するかどうかを確認します。オートローダーはコアクラスに影響を与えるべきではなく、コアクラスをロードするためにオートローダーは必要ありません。

于 2012-11-20T01:31:08.550 に答える