Должна ли автоматическая загрузка пространства имен PHP использовать папки?
Я совершенно запутался в реализации пространства имен в php, особенно когда дело доходит до классов, импортирующих псевдонимы.
Я следовал инструкциям из этого руководства:
- Использование пространств имен PHP версии 5.3 для читаемого и поддерживаемого кода (автор Дон Денонкур; 1 марта 2011 г.; для IBM Developerworks)
Но я не понимаю - когда используется __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);
?>
Сообщение об ошибке,
Предупреждение: требуется(barbarian/Conan.php ): не удалось открыть поток: Нет такого файла или каталога в C:\wamp\www\test\2013\php\namepsace\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
?
2 answers
Автоматическая загрузка классов с пространствами имен означает, что он должен следовать соглашению, обычно это соглашение предполагает использование папок ( сравните с PSR-0).
Если у вас есть классы, которые иногда следуют этому соглашению, то как загрузчик будет знать, когда использовать папки или нет?
Таким образом, в конечном счете, да классы должны храниться в папках в соответствии с их пространствами имен. Если вы считаете, что структура папок не имеет смысла, то вам следует изменить обе пространства имен и структура папок отражают то, что вы действительно хотите.
Вам не нужно использовать каталоги, если вы этого не хотите - этот пример, конечно, делает это, но вы можете реализовать загрузку любым удобным для вас способом. Вы можете поместить все классы в одну папку и использовать символы подчеркивания в форме Classes/Barbarian_Conan.php
. Однако это может стать довольно запутанным, и вам придется решить, что делать, если вы столкнулись с подчеркиванием в имени класса или пространства имен!
Все это говорит о том, что использовать каталоги таким образом - хорошая идея. Для максимальной совместимости с другими PHP программное обеспечение, кроме того, рекомендуется следовать PSR-0. Более подробная информация об этой группе стандартов здесь.
Как я обнаружил в Интернете, а вы обнаружили в результате экспериментов, ни имя класса, ни имена путей к пространству имен не могут содержать зарезервированное слово PHP.