首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获取对象的非限定(短)类名?

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

Stack Overflow用户
提问于 2013-11-11 16:28:23
回答 16查看 124.8K关注 0票数 174

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

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

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

代码语言:javascript
复制
If(get_class($object) == 'Name') {
... do this ...
}

namespace magic关键字返回当前的名称空间,如果测试对象有另一个名称空间,则没有任何用处。

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

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

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2013-11-11 23:09:46

你可以用反射来做这件事。具体地说,您可以使用ReflectionClass::getShortName方法,该方法获取不带其命名空间的类名。

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

代码语言:javascript
复制
$reflect = new ReflectionClass($object);
if ($reflect->getShortName() === 'Name') {
    // do this
}

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

票数 214
EN

Stack Overflow用户

发布于 2016-11-03 17:41:44

如果你使用的是Laravel PHP框架,这里有一个更简单的方法:

代码语言:javascript
复制
<?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));
}
票数 37
EN

Stack Overflow用户

发布于 2014-01-09 16:58:51

我使用的是:

代码语言:javascript
复制
basename(str_replace('\\', '/', get_class($object)));
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19901850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档