5

我对在 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);
?>

错误信息,

警告:需要(野蛮人/柯南.php):打开流失败:第 12 行的 C:\wamp\www\test\2013\php\namepsace\autoload.php 中没有这样的文件或目录

自动加载.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中?

4

2 回答 2

8

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

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

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

于 2013-03-28T17:57:56.370 回答
3

如果您不想使用目录,则不必使用目录 - 当然,该示例确实如此,但您可以实现任何您希望的加载方式。您可以将所有类放在一个文件夹中,并在表单中使用下划线字符Classes/Barbarian_Conan.php。但是,这可能会变得非常混乱,如果您在类或命名空间名称中遇到下划线,您必须弄清楚该怎么做!

综上所述,以这种方式使用目录是个好主意。此外,为了实现与其他 PHP 软件的最大互操作性,遵循PSR-0是一个好主意。有关此标准组的更多详细信息,请点击此处

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

于 2013-03-28T18:08:25.417 回答