PHP自动加载器和命名空间

时间:2012-07-16 00:00:21

标签: php namespaces spl-autoloader

我对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;

初始化它

非常感谢

1 个答案:

答案 0 :(得分:1)

PSR-0自动加载器约定不要求使用映射到目录结构的命名空间。您也可以在类名中使用下划线,基本上是相同的目的。

\命名空间分隔符类似,在查找要加载的文件时,类名中的任何下划线都会转换为DIRECTORY_SEPARATOR。因此,课程user_User\user\User都会导致自动加载器查找相同的文件:user/User.php