PHP名称空间自动加载必须使用文件夹吗?


Does PHP namespace autoloading have to use folders?

在php中实现命名空间时我很困惑,特别是当涉及到别名导入类时。

我遵循了本教程中的教程:

  • 利用PHP V5.3名称空间来编写可读和可维护的代码(by Don Denoncourt;2011年3月1日;(用于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.phpbarbarian文件夹

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

错误信息,

警告:require(barbarian/Conan.php): failed to open stream: No such'wamp'www'test'2013'php'namepsace' autolload .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相比)。

如果你的类有时遵循这个约定,那么自动加载器如何知道何时使用文件夹或不使用文件夹?

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

如果您不愿意,您不必使用目录—当然,这个例子就是这样,但是您可以以任何您希望的方式实现加载。您可以将所有类放在一个文件夹中,并在Classes/Barbarian_Conan.php格式中使用下划线字符。然而,这可能会变得相当混乱,如果在类或名称空间名称中遇到下划线,您必须弄清楚该怎么做!

总而言之,以这种方式使用目录是个好主意。此外,为了与其他PHP软件实现最大的互操作性,遵循PSR-0是一个好主意。关于此标准组的更多细节请点击此处。

正如我从web上发现的,以及您从实验中发现的,类名和命名空间路径名都不能包含PHP保留字。