Нужно ли использовать автозагрузку PHP для использования папок?

Я довольно запутался в реализации пространства имен в php, особенно когда речь заходит об алиасах – импорте классов.

Я следил за учебником из этого урока:

  • Использование пространств имен PHP V5.3 для читаемого и поддерживаемого кода (от Don Denoncourt, 1 марта 2011 г., для IBM Developerworks)

Но я не понимаю – когда используется __autoload , почему я должен хранить классы псевдонимов в папках, но когда __autoload не используется, псевдоним в пространстве имен просто прекрасен, как __autoload ниже,

 <?php namespace barbarian; class Conan { var $bodyBuild = "extremely muscular"; var $birthDate = 'before history'; var $skill = 'fighting'; } namespace obrien; class Conan { var $bodyBuild = "very skinny"; var $birthDate = '1963'; var $skill = 'comedy'; } use \barbarian\Conan as mother; $conan = new mother(); var_dump($conan); var_dump($conan->bodyBuild); $conan = new \obrien\Conan(); var_dump($conan); var_dump($conan->birthDate); ?> 

Хотя это я получу ошибку, если я не Conan.php в папке barbarian

 <?php require_once "autoload.php"; use \barbarian\Conan as Cimmerian; $conan = new Cimmerian(); var_dump($conan); ?> 

сообщение об ошибке,

Предупреждение: require (barbarian / Conan.php): не удалось открыть поток: нет такого файла или каталога в C: \ wamp \ www \ test \ 2013 \ php \ namepace \ autoload.php в строке 12

Файл autoload.php:

 <?php function __autoload($classname) { $classname = ltrim($classname, '\\'); $filename = ''; $namespace = ''; if ($lastnspos = strripos($classname, '\\')) { $namespace = substr($classname, 0, $lastnspos); $classname = substr($classname, $lastnspos + 1); $filename = str_replace('\\', '/', $namespace) . '/'; } $filename .= str_replace('_', '/', $classname) . '.php'; require $filename; } ?> 

Нужно ли хранить классы псевдонимов в папках? Можно ли импортировать классы, не сохраняя их в папках при использовании autoload ?

Автозагрузка классов с пространствами имен означает, что он должен следовать соглашению, обычно это соглашение включает в себя использование папок ( сравнение с PSR-0 ).

Если у вас есть классы, которые иногда следуют этому соглашению, то как автозагрузчик знает, когда использовать папки или нет?

Таким образом, в конечном счете, классы должны храниться в папках в соответствии с их пространствами имен. Если вы считаете, что структура папок не имеет смысла, вы должны изменить пространство имен и структуру папок, чтобы отразить то, что вы действительно хотите.

Вам не нужно использовать каталоги, если вы этого не хотите – этот пример, конечно, но вы можете реализовать загрузку по своему усмотрению. Вы можете поместить все классы в одну папку и использовать символы подчеркивания в форме Classes/Barbarian_Conan.php . Однако это может стать довольно грязным, и вам нужно будет решить, что делать, если вы столкнулись с подчеркиванием в классе или имени пространства имен!

Все сказанное, это хорошая идея использовать каталоги таким образом. Для максимальной совместимости с другим программным обеспечением PHP, кроме того, неплохо следовать PSR-0 . Подробнее об этой группе стандартов здесь .

Как я обнаружил из Интернета, и вы обнаружили из эксперимента, ни имя класса, ни имена пути пространства имен не могут содержать зарезервированное слово PHP.