Загрузить базовые классы php с помощью пользовательского автозагрузчика

Я искал базу данных вопросов на форуме, но не могу найти решение, ориентированное на мой вопрос.

Я пришел к вам, потому что у меня возникло сомнение с автозагрузчиком, который я разрабатываю.

Дело в том, что когда я пытаюсь создать экземпляр класса, определенного мной, автозагрузчик работает нормально, но когда я пытаюсь создать экземпляр класса ядра 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


person Filiberto Zaá Avila    schedule 20.11.2012    source источник
comment
Мне кажется, что расширение PDO не загружено.   -  person xelber    schedule 20.11.2012
comment
Работает ли PDO на обычном скрипте? Например. PDO не установлен/загружен?   -  person Green Black    schedule 20.11.2012
comment
Кроме того, может помочь обмен кодом автозагрузчика.   -  person Achilles    schedule 20.11.2012
comment
Как вы ожидаете, что мы оценим вашу проблему, если вы не покажете нам код вашего пользовательского автозагрузчика? Пожалуйста, включите его в свой вопрос.   -  person Decent Dabbler    schedule 20.11.2012
comment
Да, PDO работает на обычном скрипте, этот код находится в производстве, по сути, я обновляю существующий код для работы с пространством имен.   -  person Filiberto Zaá Avila    schedule 20.11.2012


Ответы (2)


Ну друзья мои.

У меня есть причина, по которой я не загружал класс PDO ядра PHP.

Согласно моим исследованиям, я делаю одно из двух:

Или поставить обратную косую черту во время экземпляров класса

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

Или поместите класс PDO в предложение использования.

use api\ecobd\nucleo\Conexion, PDO;

Я прокомментировал, что выбрал второе, потому что первое не сработало.

В любом случае спасибо за оказанную помощь, она хорошо послужила мне, чтобы лучше нацелить поиск на решение моей проблемы :)

person Filiberto Zaá Avila    schedule 20.11.2012

Проверьте, загружено ли расширение PDO и работает ли PDO без регистрации вашего автозагрузчика. Автозагрузчик не должен влиять на основные классы, и вам не нужен автозагрузчик для загрузки основных классов.

person xelber    schedule 20.11.2012
comment
Я сделал это, и он работает в совершенстве, это код, который используется для производства, и он работает, но я создаю новую линию разработки кода для обновления и управления пространством имен. Из того, что я исследовал, это не должно влиять на загрузку основного класса, но я не делаю автозагрузку для загрузки, это просто для загрузки моих классов. - person Filiberto Zaá Avila; 20.11.2012