【问题标题】:Using namespaces with autoloading使用带有自动加载的命名空间
【发布时间】:2014-07-02 20:45:22
【问题描述】:

所以我得到了自动加载类的一小段代码。在我添加命名空间之前,一切都会好起来的。我得到它找不到类的错误。但是当我删除命名空间时,它又可以工作了。 (当我直接包含 wbp.Foo.php 时它也有效。)

自动加载器.php

<?php

function autoloadLib($className){
    $filename = "lib/wbp." . $className . ".php";
    if(is_readable($filename)){
        require $filename;
    }
}

spl_autoload_register("autoloadLib");

index.php

<?php

include "autoloader.php";
use Foobar\Foo;
echo Foo::Bar();

lib/wbp.Foo.php

<?php

namespace Foobar;

class Foo {
    public static function Bar(){
        return "foobar";
    }
}

【问题讨论】:

  • 因为我在一个项目中实现这个,每个核心 php 代码都以前缀 wbp 开头。
  • 已删除 cmets.. 不错。
  • 在自动加载函数中尝试var_dump($className)。也许命名空间是传入的类名的一部分,所以wpb.Foobar\Foo.php 不可读?
  • 我得到字符串(10)“Foobar\Foo”。所以是的,它有点合乎逻辑,它找不到 wbp.Foobar\Foo.php。但是我应该怎么做呢?
  • 您可以将名称解析为路径并将类文件移动到将命名空间作为其位置的一部分的文件夹结构(建议)或删除自动加载中的命名空间并使用班级名称。我建议前者只是因为命名空间的目的是允许两个具有相同名称的类以不同的定义存在。如果只使用类名,则无法真正支持同一位置的两个文件。重命名和使用新路径可以像str_replace('\\', '.', $className) 一样简单。

标签: php namespaces autoload


【解决方案1】:

在自动加载中,$className 变量包含命名空间。您需要将类移动到包含命名空间的文件/文件夹结构中,或者从类名中删除命名空间并仅基于类加载。我建议前者只是因为命名空间的全部意义在于允许两个不同的类定义具有相同的名称。您实际上不能在磁盘上的同一空间中拥有两个同名的文件。重命名$className 可以像str_replace('\\', '.', $className) 一样简单,然后将你的类重命名为wbp.NameSpace.ClassName.php

【讨论】:

    【解决方案2】:

    如果您从命名空间开始,您应该简单地阅读http://www.php-fig.org/psr/psr-4/ 的 PSR-4 文档 - 还有自动加载器的示例。

    PSR-4 正在成为一个标准,所以最好的方法就是这样做

    【讨论】:

    • 这实际上可能会派上用场,谢谢。只有我现在必须更改项目中的内容..
    猜你喜欢
    • 2021-04-04
    • 1970-01-01
    • 2014-05-02
    • 2011-11-19
    • 2013-11-25
    • 2014-04-13
    • 1970-01-01
    相关资源
    最近更新 更多