如何在 PHP 名称空间环境中检查对象的类而不指定完整的命名空间类。
例如,假设我有一个对象库/实体/合同/名称。
以下代码不起作用,因为 get_class 返回完整的命名空间类。
If(get_class($object) == 'Name') { ... do this ... }
命名空间魔法关键字返回当前命名空间,如果测试对象有另一个命名空间,则它没有用。
我可以简单地用命名空间指定完整的类名,但这似乎锁定了代码的结构。如果我想动态更改命名空间,也没有多大用处。
谁能想到一种有效的方法来做到这一点。我想一种选择是正则表达式。
你可以通过反射来做到这一点。具体来说,您可以使用该ReflectionClass::getShortName方法,该方法获取没有其命名空间的类的名称。
ReflectionClass::getShortName
首先,您需要构建一个ReflectionClass实例,然后调用该getShortName实例的方法:
ReflectionClass
getShortName
$reflect = new ReflectionClass($object); if ($reflect->getShortName() === 'Name') { // do this }
但是,我无法想象在许多情况下这是可取的。如果你想要求对象是某个类的成员,测试它的方法是使用instanceof. 如果您想要一种更灵活的方式来表示某些约束,那么这样做的方法是编写一个接口并要求代码实现该接口。同样,正确的方法是使用instanceof. (您可以使用 来做到这一点ReflectionClass,但性能会差得多。)
instanceof