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

时间:2013-03-28 17:52:44

标签: php namespaces alias autoload

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

我已按照本教程中的教程进行操作:

但我不明白 - 当使用__autoload时,为什么我必须将别名类存储在文件夹中,但当__autoload 不<时/ strong>使用,命名空间中的别名就好了,如下所示,

<?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 \ 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 个答案:

答案 0 :(得分:8)

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

如果您的课程有时遵循该惯例,那么自动加载器如何知道何时使用文件夹?

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

答案 1 :(得分:3)

如果您不希望使用目录,则不必使用目录 - 当然,您可以按照您希望的方式实现加载。您可以将所有类放在单个文件夹中,并使用Classes/Barbarian_Conan.php形式的下划线字符。但是,这可能会非常混乱,如果您在类或命名空间名称中遇到下划线,则必须确定要执行的操作!

大家都这么说,以这种方式使用目录是个好主意。为了最大程度地与其他PHP软件实现互操作性,最好遵循PSR-0。有关此标准组的更多详细信息here

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