1

我在使用此自动加载器加载的多个子文件夹中有很多类:

spl_autoload_register(function ($class) {
    $class = str_replace('\\', DIRECTORY_SEPARATOR, strtolower($class));
    if(file_exists(FILES_PATH.'classes/'.$class.'.class.php')){
        require_once(FILES_PATH.'classes/'.$class.'.class.php');
    }
});

因此,如果我执行 new Folder\subFolder\Myclass,它会起作用。

文件夹中的类都在一个命名空间中。

所有这些类都必须使用数据库类,问题就在这里:当类在命名空间中并搜索数据库类时,它找不到它。

(数据库类在全局命名空间中)

所以我尝试输入“使用 BDD”(Bdd 是 db 类)但它仍然不起作用,因为 Bdd 正在使用 PDO,所以我必须执行“使用 bdd,pdo;” 在项目的每一个类中......

我觉得这很愚蠢。这是正常的吗?有没有更好的方法来自动加载,而不使用命名空间?

4

3 回答 3

2

这非常简单:

如果您在这样的命名空间中:

namespace Foo;

所有类的所有名称都相对于该命名空间进行解析。AnyBar将意味着 class Foo\Bar,而不是 "global" Bar。如果您想以任何方式、形状或形式引用不在同一命名空间中的Bar\Baz类,例如(Baz来自命名空间的类Bar),您有两种选择:

  1. 使用类的完全限定名称,例如:

    \Bar\Baz
    

    其中前导\表示类名应从顶级命名空间解析,而不是当前本地命名空间,或

  2. 如果每次都这样做很烦人,请使用以下别名

    use Bar\Baz;
    

    这是简写

    use Bar\Baz as Baz;
    

    这意味着任何时候你Baz在这个命名空间中使用“”你的意思是类Bar\Baz,而不是Foo\Bar\Baz

是的,这单独适用于每个文件。如果您想PDO在某个文件的某个命名空间中引用,您要么必须编写\PDO以使其解析为“全局”PDO类,要么您use PDO在文件顶部编写以创建一个方便的别名。这就是命名空间的工作方式。

这适用于任何类名的所有用例:

new \PDO
\PDO::staticMethod()
\PDO::CONSTANT
于 2013-08-12T14:24:15.580 回答
1

通过在代码中执行以下操作,您可以明确地说 BDD 在全局命名空间中:

$foo = new \BDD();

那么你不应该需要use它。

于 2013-08-12T10:25:20.047 回答
0

从我的一条评论中得到答案;)

在 BDD 类中使用use \Pdo;固定世界 :)

于 2013-08-12T13:24:54.833 回答