2013-08-12 62 views
1

重复使用我,我加载时使用这个自动加载的倍数子文件夹的大量类:PHP的命名空间 - 在每个类

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

所以,如果我做新的文件夹\子文件夹\ MYCLASS,它的工作原理。

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

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

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

所以我试图把“使用BDD”(BDD是DB类),它仍然无法正常工作,因为BDD使用PDO,所以我必须做“使用bdd,pdo;”在项目的每一个阶段...

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

+1

考虑采用PSR编码标准及其自动加载磁带机:http://phpmaster.com/autoloading-and-the-psr-0-standard/ – Gordon

+1

尝试使用像'\ BDD'这样的全局类。它应该解决这个问题。 –

+0

是的,每个文件都有自己的命名空间声明,因此它自己的'use'导入。不,这是没有办法的。不,这不是“愚蠢的”。我不明白为什么你需要在每个使用BDD的文件中使用PDO。 – deceze

回答

2

这是相当不错的简单:

如果你像这样一个命名空间是:

namespace Foo; 

所有类的所有名称都是相对于该名称空间解析的。任何Bar将表示类别Foo\Bar,而不是“全球”Bar。如果你想以任何方式是指,形状或形式,以一类是不在同一个命名空间,说(从命名空间BarBazBar\Baz,你有两个选择:

  1. 使用完全合格名称为类,如:

    \Bar\Baz 
    

    其中超前\意味着类名应当从顶部的命名空间,而不是当前本地一个得到解决,或

  2. 如果我ŝ越来越讨厌做每一次,别名它使用:

    use Bar\Baz; 
    

    这是

    use Bar\Baz as Baz; 
    

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

是的,这适用于每个文件单独。如果要在某个文件的某个命名空间中引用PDO,则必须编写\PDO以使其解析为“全局”PDO类,或者在文件顶部编写use PDO以制作便利别名。这就是命名空间的工作原理。

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

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

谢谢,我明白更好。但是,WTF ... 自动加载使我减少了数百行的项目,但命名空间使我复制/粘贴一百行文件中的一行! 这有点让人失望...... – FLX

1

可以明确地说,BDD是在全局命名空间在代码中这样做:

$foo = new \BDD(); 

那么你不应该需要use它。

+0

是的,我已经看到,但它不工作。只有使用正在工作...这可能是因为我没有做新的Bdd,但Bdd :: getInstance。 – FLX

+0

so \ Bdd :: getInstance不起作用?你遇到了什么错误? –

+0

您是否尝试在BDD类中使用'use PDO'或'\ PDO'? –

0

移动从我的意见一个答案;)

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

+0

对不起,我认为它很好,但事实上,当我从命名空间类调用Bdd类时,在命名空间中使用PDO :: FETCH函数时仍然有同样的错误...这真的很奇怪。所以我认为我被迫放置“使用bdd,pdo;”到处都是......我不喜欢那样。无论如何感谢... – FLX