php - 如何检查 namespace 中是否存在类?

标签 php oop namespaces

我有这个:

    use XXX\Driver\Driver;

...

var_dump(class_exists('Driver')); // false
        $driver = new Driver(); // prints 123123123 since I put an echo in the constructor of this class
        exit;

嗯...这种行为是非常不合理的(创建根据 PHP 不存在的类的对象)。有没有办法检查给定命名空间下是否存在一个类?

最佳答案

为了检查类,您必须使用命名空间、完整路径来指定它:

namespace Foo;
class Bar
{
}

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

-即您必须指定类的完整路径。您在命名空间中定义它,而不是在全局上下文中。

但是,如果您确实像在示例中那样在命名空间中导入类,则可以通过导入的名称而不使用命名空间来引用它,但这不允许您在动态构造中执行此操作,特别是在 -形成类名的行字符串。例如,以下所有操作都会失败:

namespace Foo;
class Bar {
    public static function baz() {} 
}

use Foo\Bar;

var_dump(class_exists('Bar')); //false
var_dump(method_exists('Bar', 'baz')); //false

$ref = "Bar";
$obj = new $ref(); //fatal

等等。问题在于为导入的别名工作的机制。因此,在使用此类结构时,您必须指定完整路径:

var_dump(class_exists('\Foo\Bar')); //true
var_dump(method_exists('\Foo\Bar', 'baz')); //true

$ref = 'Foo\Bar';
$obj = new $ref(); //ok

关于php - 如何检查 namespace 中是否存在类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22407370/

相关文章:

php - 如何获取未读通知(2个带FK的表)

php - IOS字典到php数组

delphi - 将多个对象作为一个参数传递

c++ - C++ 中的类和封装 (OOP)

c++ - 错误 lnk2005 已在 .obj 中定义

php - 优化 mysql 数据库 - 任务列表耗尽了我的服务器

php - 启用 php.ini 以实现向后兼容性

php - 一个类的实例可以更改另一个类的实例中的变量吗?

model-view-controller - DLL 命名空间中的 MVC Controller

docker - 如何重命名 Bluemix namespace (容器注册表)?