Php 从类引用中获取类名称空间和名称,而不更改我的类
在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
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仍然是非常新的,几乎没有在野外使用过。除非你使用自己的服务器,否则你很难使用它的新功能。