2009-03-20 3 views
1

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

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

class Bar extends Foo 

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

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

Кто-нибудь?

ответ

2

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

5

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

$className = strtolower($className); 

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

0

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

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

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

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

EDIT (больше информации):

Вместо того, чтобы рекурсивно спускаться в каталог класса ищет нужный файл, я сопоставить имя класса в определенном месте. Это обычная практика. Например, 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().

+0

Вы могли бы показать пример? – sanders

1

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

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

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

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

+0

Разве это не то, что драматично для чего-то, что вы можете четко решить, используя соглашение для filenaming – Johnny

+0

Ну, Мы все люди, которые совершают ошибки; - + – sanders

+0

Не было бы более значимым исключением/сообщением об ошибке :) – Johnny