在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.php
在barbarian
文件夹
<?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保留字。