小编典典

如何获取对象的非限定(短)类名?

all

如何在 PHP 名称空间环境中检查对象的类而不指定完整的命名空间类。

例如,假设我有一个对象库/实体/合同/名称。

以下代码不起作用,因为 get_class 返回完整的命名空间类。

If(get_class($object) == 'Name') {
... do this ...
}

命名空间魔法关键字返回当前命名空间,如果测试对象有另一个命名空间,则它没有用。

我可以简单地用命名空间指定完整的类名,但这似乎锁定了代码的结构。如果我想动态更改命名空间,也没有多大用处。

谁能想到一种有效的方法来做到这一点。我想一种选择是正则表达式。


阅读 57

收藏
2022-07-30

共1个答案

小编典典

你可以通过反射来做到这一点。具体来说,您可以使用该ReflectionClass::getShortName方法,该方法获取没有其命名空间的类的名称。

首先,您需要构建一个ReflectionClass实例,然后调用该getShortName实例的方法:

$reflect = new ReflectionClass($object);
if ($reflect->getShortName() === 'Name') {
    // do this
}

但是,我无法想象在许多情况下这是可取的。如果你想要求对象是某个类的成员,测试它的方法是使用instanceof.
如果您想要一种更灵活的方式来表示某些约束,那么这样做的方法是编写一个接口并要求代码实现该接口。同样,正确的方法是使用instanceof. (您可以使用
来做到这一点ReflectionClass,但性能会差得多。)

2022-07-30