如何在PHP命名空间环境中检查对象的类,而不指定完整的命名空间类。
例如,假设我有一个对象库/实体/契约/名称。
下面的代码不起作用,因为get_class返回完整的命名空间类。
If(get_class($object) == 'Name') {
... do this ...
}
namespace magic关键字返回当前的名称空间,如果测试对象有另一个名称空间,则没有任何用处。
我可以简单地使用名称空间指定完整的类名,但这似乎锁定了代码的结构。如果我想要动态更改名称空间,也没有多大用处。
有没有人能想出一个有效的方法来做到这一点。我想一种选择是正则表达式。
发布于 2013-11-11 23:09:46
你可以用反射来做这件事。具体地说,您可以使用ReflectionClass::getShortName
方法,该方法获取不带其命名空间的类名。
首先,您需要构建一个ReflectionClass
实例,然后调用该实例的getShortName
方法:
$reflect = new ReflectionClass($object);
if ($reflect->getShortName() === 'Name') {
// do this
}
然而,我无法想象在很多情况下这样做是可取的。如果您想要求对象是某个类的成员,那么测试它的方法就是使用instanceof
。如果您想要一种更灵活的方式来通知某些约束,那么实现此目的的方法是编写一个接口并要求代码实现该接口。同样,正确的方法是使用instanceof
。(您可以使用ReflectionClass
完成此操作,但它的性能会差得多。)
发布于 2016-11-03 17:41:44
如果你使用的是Laravel PHP框架,这里有一个更简单的方法:
<?php
// usage anywhere
// returns HelloWorld
$name = class_basename('Path\To\YourClass\HelloWorld');
// usage inside a class
// returns HelloWorld
$name = class_basename(__CLASS__);
/**
* Get the class "basename" of the given object / class.
*
* @param string|object $class
* @return string
*/
function class_basename($class)
{
$class = is_object($class) ? get_class($class) : $class;
return basename(str_replace('\\', '/', $class));
}
发布于 2014-01-09 16:58:51
我使用的是:
basename(str_replace('\\', '/', get_class($object)));
https://stackoverflow.com/questions/19901850
复制相似问题