我对PHP中的自动加载器和命名空间感到有些困惑。
我的课程在资产档案中组织,
-- Assets
-- user
-- User.php
-- database
-- Database.php
这只是一个简单版本,每个文件夹中有更多文件(即用户,数据库)。
没有必要担心供应商名称冲突,因为这个项目中只有一个供应商(即我),但是,例如,使用PSR0自动加载器:
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('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
require $fileName;
}
我是否需要在每个类文件中声明一个命名空间,并使用new user\User();
初始化一个类。是否无法使用new user_User;
非常感谢
答案 0 :(得分:1)
PSR-0自动加载器约定不要求使用映射到目录结构的命名空间。您也可以在类名中使用下划线,基本上是相同的目的。
与\
命名空间分隔符类似,在查找要加载的文件时,类名中的任何下划线都会转换为DIRECTORY_SEPARATOR
。因此,课程user_User
和\user\User
都会导致自动加载器查找相同的文件:user/User.php
。