如何获得对象的非限定(简称)类名?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

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

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

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

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

命名空间magic关键字返回当前命名空间,如果被测试对象具有另一个命名空间,这是没用的。

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

谁能想到一个有效的方法来做到这一点?我猜一个选项是正则表达式。

提问于
用户回答回答于

你可以用反射来做到这一点。具体而言,你可以使用该ReflectionClass::getShortName方法,该方法获取不带名称空间的类的名称。

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

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

用户回答回答于

(new \ReflectionClass($obj))->getShortName();是性能方面的最佳解决方案。

我很好奇提供的解决方案中哪一个是最快的,所以我做了一个小小的测试。

结果

Reflection: 1.967512512207 s ClassA
Basename:   2.6840535163879 s ClassA
Explode:    2.6507515668869 s ClassA

代码

namespace foo\bar\baz;

class ClassA{
    public function getClassExplode(){
        $c = array_pop(explode('\\', get_class($this)));
        return $c;
    }

    public function getClassReflection(){
        $c = (new \ReflectionClass($this))->getShortName();
        return $c;
    }

    public function getClassBasename(){
        $c = basename(str_replace('\\', '/', get_class($this)));
        return $c;
    }
}

$a = new ClassA();
$num = 100000;

$rounds = 10;
$res = array(
    "Reflection" => array(),
    "Basename" => array(),
    "Explode" => array(),
);

for($r = 0; $r < $rounds; $r++){

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassReflection();
    }
    $end = microtime(true);
    $res["Reflection"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassBasename();
    }
    $end = microtime(true);
    $res["Basename"][] = ($end-$start);

    $start = microtime(true);
    for($i = 0; $i < $num; $i++){
        $a->getClassExplode();
    }
    $end = microtime(true);
    $res["Explode"][] = ($end-$start);
}

echo "Reflection: ".array_sum($res["Reflection"])/count($res["Reflection"])." s ".$a->getClassReflection()."\n";
echo "Basename: ".array_sum($res["Basename"])/count($res["Basename"])." s ".$a->getClassBasename()."\n";
echo "Explode: ".array_sum($res["Explode"])/count($res["Explode"])." s ".$a->getClassExplode()."\n";

扫码关注云+社区