PHP命名空间自动加载是否必须使用文件夹?

lau*_*kok 5 php alias namespaces autoload

我很困惑在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);
?>
Run Code Online (Sandbox Code Playgroud)

虽然我会得到错误,如果我不存储Conan.php在文件夹中barbarian

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

错误信息,

警告:require(barbarian/Conan.php):无法打开流:第12行的C:\ wamp\www\test\2013\php \namepsace\autoload.php中没有此类文件或目录

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;
}
?>
Run Code Online (Sandbox Code Playgroud)

是否必须在文件夹中存储别名类?是否可以在使用时导入类而不将它们存储在文件夹中autoload

Pop*_*lus 8

使用命名空间自动加载类意味着它必须遵循约定,通常该约定涉及使用文件夹(与PSR-0比较).

如果您的类有时遵循该约定,那么自动加载器如何知道何时使用文件夹?

所以最终,是的类应该根据它们的命名空间存储在文件夹中.如果您认为文件夹结构没有意义,那么您应该更改命名空间和文件夹结构以反映您真正想要的内容.