автозагрузчик с заглавными и строчными буквами - PullRequest
1 голос
/ 20 марта 2009

Я использую этот класс в php для автозагрузки. http://pastebin.com/m75f95c3b

Но когда я где-то

class Bar extends Foo

И у меня есть файл с именем foo.class.php, он не найдет класс. Но когда я изменю имя файла на Foo.class.php, он найдет класс.

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

Любой

Ответы [ 5 ]

5 голосов
/ 20 марта 2009

Если все ваши файлы имеют строчные имена, примените strtolower к значению переменной $className в каждом методе вашего класса:

$className = strtolower($className);

Но я предлагаю вам составить некоторые рекомендации по кодированию, которые должен придерживаться каждый разработчик. В противном случае вам придется протестировать каждую из 2 <длина имени файла> возможностей записи имени файла с использованием прописных и строчных букв.

2 голосов
/ 20 марта 2009

Решение Gumbo является лучшим, и это то, что почти все используют. Я не понимаю, почему ты не любишь. Конечно, вы можете сначала проверить, существует ли файл с заглавной буквы класса, и если нет, то проверить, существует ли версия в нижнем регистре или нет. Это определенно не лучше, чем решение Гамбо. Ведь «ваши» программисты должны следовать некоторым соглашениям / правилам.

1 голос
/ 20 марта 2009

Я бы сделал это более или менее так

function __autoload($class_name) {
    $upperName = strtoupper(substr($class_name,0,1)) . substr($class_name, 1);
    $lowerName = strtolower(substr($class_name,0,1)) . substr($class_name, 1);

    //Check to see if the class file exists as-is
    if(file_exists($class_name . '.php')) {
        require_once($class_name . '.php');
    }elseif(file_exists($upperName . '.php')) {
        require_once($upperName . '.php');
    }elseif(file_exists($lowerName . '.php')) {
        require_once($lowerName . '.php');
    }else {
        throw new Exception("The class $class_name could not be found.");
    }
}

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

0 голосов
/ 20 марта 2009

Вы можете использовать автозагрузчик, который сканирует каталоги для файлов .php и фактически просматривает содержимое каждого файла для таких шаблонов, как «класс Foo», используя регулярное выражение. Конечно, вам нужно будет это кешировать, используя массив директории вида class =>. Вам также необходимо убедиться, что вы сделали недействительным кеш, например, когда в папке есть новые .php файлы.

Я делаю это для своего сайта, и он отлично работает.

0 голосов
/ 20 марта 2009

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

Он выполняет простой цикл над каждым соглашением и проверяет, существует ли этот файл. Если файл существует, он загружается.

Для моей функции я делаю это для разных расширений файлов, таких как .inc, .class или .inc.php. Вы можете сделать то же самое, но искать верхний и нижний первые символы.

Я бы поместил это в метод searchForClassFile (), в другой части с комментарием «Найден файл».

РЕДАКТИРОВАТЬ (дополнительная информация):

Вместо того чтобы рекурсивно спускаться в каталог классов в поисках правильного файла, я отображаю имя класса в определенном месте. Это обычная практика. Например, foo_bar отображается на [CLASS_DIRECTORY]/foo/bar.[EXTENSION]. В нашем случае мы проверяем несколько разных расширений.

В вашем случае вам нужно принять решение о том, как вы хотите искать файл класса, но изменив свой код:

} else {
  // Found a file
  if ($f == $className . self::$classFileSuffix ||
        $f == strtolower($className) . self::classFileSuffix) {
    return $subPath;
  }
}

Вместо strtolower () вы можете написать функцию, которая опускает только первый символ, или, если PHP> 5.3.0 (официально не выпущен), использовать функцию lcfirst ().

...