включите путь и функцию __autoload в php - PullRequest
3 голосов
/ 21 июля 2010

Я пытаюсь преобразовать несколько сценариев php для использования функции __autoload.Прямо сейчас я могу использовать такие функции include и require:

require_once('path/to/script.php');

Но внутри функции __autoload я не могу использовать строку выше.Я должен использовать это:

require_once('absolute/path/to/script.php');

Почему кажется, что функция __autoload не использует путь включения, который я указал в php.ini?

Ответы [ 4 ]

9 голосов
/ 21 июля 2010

Не используйте __autoload ... У него есть несколько недостатков (в том числе ограничение себя одним на исполнение).Вместо этого используйте spl_autoload_register, если вы используете 5.2 +.

Итак, что я обычно делаю, так это класс:

class AutoLoader {
    protected static $paths = array(
        PATH_TO_LIBRARIES,
    );
    public static function addPath($path) {
        $path = realpath($path);
        if ($path) {
            self::$paths[] = $path;
        }
    }
    public static function load($class) {
        $classPath = $class; // Do whatever logic here
        foreach (self::$paths as $path) {
            if (is_file($path . $classPath)) {
                require_once $path . $classPath;
                return;
            }
        }
    }
}
spl_autoload_register(array('AutoLoader', 'load'));

Таким образом, если выдобавив набор библиотек, вы можете просто «добавить его» в свои пути, вызвав AutoLoader::AddPath($path);.Это значительно облегчает тестирование с помощью вашего автозагрузчика (ИМХО).

Еще одно замечание.Не выбрасывайте исключения из класса автозагрузки, если это не является абсолютно необходимым.Причина в том, что вы можете установить несколько автозагрузчиков, поэтому, если вы не знаете, как загрузить файл, может существовать другой, чтобы загрузить его.Но если вы сгенерируете исключение, оно пропустит другое ...

Лично я никогда не хотел бы использовать относительные пути с включениями.Особенно с несколькими включаемыми каталогами (например, pear), очень трудно точно знать, какой файл импортируется, когда вы видите require 'foo/bar.php';.Я предпочитаю определять абсолютный путь в начале набора файлов define('PATH_ROOT', dirname(__FILE__));, а затем определять все другие мои полезные пути вне этого каталога (PATH_LIBRARIES, PATH_TEMPLATES и т. Д.).Таким образом, все абсолютно определено ... И нет необходимости иметь дело с относительными путями (как проблема, с которой вы столкнулись сейчас) ...

0 голосов
/ 21 июля 2010

Кажется, что . не входит в ваш путь включения.Так что добавьте его:

set_include_path('.' . PATH_SEPARATOR . get_include_path());

Теперь PHP должен выглядеть также относительно каталога исполняемых скриптов.(Выполненный скрипт здесь выглядит примерно так: index.php, а не autoload.php.

. Но почему бы просто не использовать обычный относительный путь, например ./path/to/class.php?

0 голосов
/ 21 июля 2010

Я подозреваю, что ваша функция __autoload() находится в отдельном файле, а затем в коде, который ее вызывает.Путь к включаемым файлам будет относительно файла, в котором находится объявление функции __autoload().

0 голосов
/ 21 июля 2010

Не уверен, не видя всей установки. Моя функция автозагрузки находится в моем файле глобальных функций и выглядит следующим образом:

function __autoload($class) {
    if (file_exists("includes/{$class}.php")) {
        require_once("includes/{$class}.php");
    }
    /**
     * Add any additional directories to search in within an else if statement here
     */
    else {
        // handle error gracefully
    }
}

Я использую относительный путь, потому что скрипт включен в мой файл index.php и все HTTP-запросы передаются через него.

...