【发布时间】: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