Php命名空间 - 重复在每个类中使用

时间:2013-08-12 10:18:07

标签: php class namespaces autoload

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

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');
    }
});

所以如果我做新的Folder \ subFolder \ Myclass,它就可以了。

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

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

(DB类在全局命名空间中)

所以我尝试将“使用BDD”(Bdd是db类)并且它仍然不起作用,因为Bdd正在使用PDO,因此我必须“使用bdd,pdo;”在项目的每个类......

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

3 个答案:

答案 0 :(得分:2)

这很简单:

如果你是这样的名称空间:

namespace Foo;

所有类的所有名称都是相对于该命名空间解析的。任何Bar都意味着课程Foo\Bar,而不是"全球" Bar。如果您想以任何方式,形状或形式引用不在同一名称空间中的类,请说Bar\Baz(来自名称空间Baz的类Bar),您有两个选择:

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

    \Bar\Baz
    

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

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

    use Bar\Baz;
    

    这是

    的简写
    use Bar\Baz as Baz;
    

    这意味着您在任何时候使用" Baz"在此命名空间中,您指的是课程Bar\Baz,而不是Foo\Bar\Baz

  3. 是的,这适用于每个文件。如果要在某个文件中的某个命名空间中引用PDO,则必须编写\PDO以使其解析为" global" PDO类或您在文件顶部写use PDO以获得便利别名。这就是命名空间的工作原理。

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

    new \PDO
    \PDO::staticMethod()
    \PDO::CONSTANT
    

答案 1 :(得分:1)

您可以在代码中明确说明BDD在全局命名空间中:

$foo = new \BDD();

然后你不需要use它。

答案 2 :(得分:0)

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

在BDD类中使用use \Pdo;修复了世界:)