如何在php中检查命名空间是否存在

20

我有一个 php库 https://github.com/tedivm/Fetch,它使用Fetch命名空间,我想在我的脚本中检查它是否存在。

我的脚本代码:

// Load Fetch
spl_autoload_register(function ($class) {
    $file = __DIR__ . '/vendor/' . strtr($class, '\\', '/') . '.php';
    if (file_exists($file)) {
        require $file;

        return true;
    }
});

if (!class_exists('\\Fetch')) {
  exit('Failed to load the library: Fetch');
}
$mail = new \Fetch\Server($server, $port);

但是这个消息总是出现。但是该库完全可以使用。

感谢您提前的任何帮助!

3个回答

41

我认为你需要在class_exists中使用完整的命名空间,例如:

class_exists('Fetch\\Server')

抱歉,没有前置反斜杠,正在更新答案。 - ars265
2
单引号字符串中不需要双斜杠。class_exists('Fetch\Server') - DrLightman
答案可能是奇怪的或不完整的。请添加一个注释,说明您需要检查该命名空间中类的存在性。因此,我们不能仅仅检查命名空间。 - Bitterblue

6
正如 George Steel 所写,检查命名空间是不可能的。这是因为命名空间并不存在,只有在命名空间中存在的符号。参见以下示例:
namespace Foo;

class Bar {
}

var_dump(class_exists('Foo')); // bool(false)
var_dump(class_exists('Foo\Bar')); // bool(true)

有一种思考方式是将其与姓氏相比较:没有所谓的姓氏,你无法获得所有“独立”的姓氏列表而不检查所有人,因此你无法直接确定一个姓氏是否存在;但它是一个人的全名(FQN)的一部分,因此你可以检索到一个人的姓氏,或者检查他们是否属于一个姓氏。
这只是一种将事物分组的方式。你可以四处看看并编制一个所有“红色”物品的清单。但你无法获得所有存在的颜色列表。

4

如果你有很多类需要处理,使用命名空间是非常好的能力,但这也可能会非常耗费(处理器)时间。 - ars265

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接