我在使用此自动加载器加载的倍数子文件夹中有很多类:
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;”在项目的每个类......
我发现这很愚蠢。这是正常的吗? 有没有更好的自动加载方式,而不使用命名空间?
答案 0 :(得分:2)
这很简单:
如果你是这样的名称空间:
namespace Foo;
所有类的所有名称都是相对于该命名空间解析的。任何Bar
都意味着课程Foo\Bar
,而不是"全球" Bar
。如果您想以任何方式,形状或形式引用不在同一名称空间中的类,请说Bar\Baz
(来自名称空间Baz
的类Bar
),您有两个选择:
使用该类的完全限定名称,例如:
\Bar\Baz
其中前导\
表示类名称应从顶级名称空间解析,而不是当前本地名称,或
如果每次都这样做很烦人,别名使用:
use Bar\Baz;
这是
的简写use Bar\Baz as Baz;
这意味着您在任何时候使用" Baz
"在此命名空间中,您指的是课程Bar\Baz
,而不是Foo\Bar\Baz
。
是的,这适用于每个文件。如果要在某个文件中的某个命名空间中引用PDO
,则必须编写\PDO
以使其解析为" global" PDO
类或您在文件顶部写use PDO
以获得便利别名。这就是命名空间的工作原理。
这适用于任何类名的所有用例:
new \PDO
\PDO::staticMethod()
\PDO::CONSTANT
答案 1 :(得分:1)
您可以在代码中明确说明BDD在全局命名空间中:
$foo = new \BDD();
然后你不需要use
它。
答案 2 :(得分:0)
从我的一条评论中回答答案;)
在BDD类中使用use \Pdo;
修复了世界:)