在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__方法的解决方案。
答案 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页面上。