我对在 php 中实现命名空间感到非常困惑,尤其是在别名导入类方面。
我已经按照本教程中的教程进行操作:
-
利用 PHP V5.3 命名空间实现可读且可维护的代码 http://www.ibm.com/developerworks/opensource/library/os-php-5.3namespaces/(作者:Don Denoncourt;2011 年 3 月 1 日;IBM Developerworks)
但我不明白——什么时候__autoload
被使用了,为什么我have to将别名类存储在文件夹中,但是当__autoload
is not使用,命名空间中的别名就可以了,如下所示,
<?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号线
自动加载.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;
}
?>
Is it a must在文件夹中存储别名类?是否可以导入类而不将它们存储在文件夹中autoload
用来?