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

Php 从类引用中获取类名称空间和名称,而不更改我的类,php,reference,classname,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' ) ); } name

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

use My\Class\MyClass

...

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

MyClass::class;
// will return "My\Long\Namespace\Foo\Bar\MyClass"
现在,我将完整的名称空间和类的名称以字符串形式传递给
sprintf

我怎样才能从类引用中得到它,这样我就可以做这样的事情了

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

我希望在不添加新方法的情况下为所有类实现这一点。因此,它应该是一个使用一些现有方法或php u__; MAGIC __;方法的解决方案

namespace test;

class a {

    public function getname()
    {
        return __CLASS__;
    }
}
以及:

输出

test\a
静态方法的工作方式相同:

public static function getname()
{
    return __CLASS__;
}

...

a::getname(); // test\a
您也只能使用
\uuuuu名称空间\uuuuu

更新: 您可以为相同的内容创建
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
最后:如果您使用PHP5.6及以上版本(用于将来),您可以使用
class
constant

echo a::class; // test\a

从PHP5.5开始,有一个神奇的常量,可以提供任何类的FQCN。您可以这样使用它:

use My\Class\MyClass

...

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

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

它在页面上有文档记录。

从php5.6开始,你可以简单地使用
MyClass::class
@Maerlyn,如果你把它作为一个答案,你会得到奖励:PYes,这会管用的,但我不想在我所有的类中添加
getName
方法。谢谢你的时间,但这些解决方案不是我想要的。如果你看到@Maerlyn的评论,你会发现有一个更简单的方法。他给了我我想要的东西。我也打算发布它,但是,首先发布我的答案,因为
MyClass::class
只适用于PHP5.6及以上版本,但无论如何,我要把它包括进去。我的phpstorm也知道这个特性,它识别出了变量:)小心点,尽管:5.6仍然是非常新的,几乎没有在野外使用过。除非你使用自己的服务器,否则你很难使用它的新功能。