Я довольно запутался в реализации пространства имен в php, особенно когда речь заходит об алиасах – импорте классов.
Я следил за учебником из этого урока:
Но я не понимаю – когда используется __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.