从类引用中获取类名称空间和名称,而不更改我的类

时间:2014-09-12 08:35:53

标签: php reference classname

在php中,你经常检查你得到的对象是否是正确的类型。如果不是,则抛出一个带有如下消息的异常:

use My\Class\MyClass

...

if (!$object instanceof MyClass) {
    throw new Exception(
        sprintf(
            "object must be of type '%s'", 
            'My\Class\MyClass'
        )
    );
}

现在我将完整的命名空间和字符串中的类名称传递给sprintf

如何从类引用中获取它,以便我可以执行类似这样的操作

sprintf("object must be of type '%s'", MyClass::getName())

修改

我想在不添加新方法的情况下为所有类实现此目的。所以它应该是使用一些现有方法或一种php __ MAGIC__方法的解决方案。

2 个答案:

答案 0 :(得分:5)

namespace test;

class a {

    public function getname()
    {
        return __CLASS__;
    }
}

$a = new a();
echo $a->getname(); // 

<强>输出

test\a

静态方法的工作方式相同:

public static function getname()
{
    return __CLASS__;
}

...

a::getname(); // test\a

您也可以只使用__NAMESPACE__

获取命名空间

<强>更新 你可以ReflectionClass同样的事情:

$a = new a();

$r = new \ReflectionClass($a);
echo $r->getName(); // test\a

您可以创建ClassHelper课程,以便在任何您需要的地方使用它:

class ClassHelper
{
    public static function getFullQualifiedName($object)
    {
        $rc = new \ReflectionClass($object);
        return $rc->getName();
    }
}

并使用它:

echo ClassHelper::getFullQualifiedName($a); // test\a

Finnaly:如果您使用的是PHP 5.6及更高版本(以后),您可以使用class常量

echo a::class; // test\a

答案 1 :(得分:4)

从PHP 5.5开始,有一个神奇的常量可以为你提供任何级别的FQCN。您可以像这样使用它:

namespace My\Long\Namespace\Foo\Bar;

MyClass::class;
// will return "My\Long\Namespace\Foo\Bar\MyClass"

它已记录在new features页面上。