除非包含或注释掉namescape,否则无法加载PHP类

时间:2014-03-27 20:22:13

标签: php autoloader psr-0

在浏览网站之后,我不知道为什么我得到一个关于我的课程没有被发现的致命错误,除非我用名称前缀为它实例化该类,或者注释掉类文件。我正在使用PSR-0试图解决这个问题而没有运气,以及this thread here,这是我最接近我的问题。

Autoloader代码:

    function autoload($className)
{
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strrpos($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;
}

spl_autoload_register('autoload');

所有三个文件的路径(Autoloader.php,Class.php,index.php)都在同一目录级别。没有子目录或类似的东西。

自动加载器代码在index.php的开头实现,带有require_once(“Autoloader.php”);

在$ foo = new classFoo();

中调用类

tl; dr版本:

  • 在被调用的类中注释掉namescape声明?作品 精细。
  • 使用namescape / class格式实例化类?作品 精细。
  • 否则?致命错误:找不到类(即使它在 同一目录。

1 个答案:

答案 0 :(得分:1)

如果您位于全局命名空间中,并且这些类位于其他某个命名空间中,那么即使文件是自动加载器require或手动,您仍然需要在声明类时使用命名空间。这就是命名空间的重点,以防止类名冲突。

您可能会混合使用PSR-0PSR-4,因为您已经使用了命名空间类,但它们没有正确地进行路径\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>