Должна ли автоматическая загрузка пространства имен PHP использовать папки?


Я совершенно запутался в реализации пространства имен в php, особенно когда дело доходит до классов, импортирующих псевдонимы.

Я следовал инструкциям из этого руководства:

Но я не понимаю - когда используется __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?

Author: halfer, 2013-03-28

2 answers

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

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

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

 8
Author: Populus, 2013-03-29 09:32:40

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

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

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

 3
Author: halfer, 2013-03-29 09:23:30