::class和get_class之间的区别

12
你能解释一下 get_class($instance)ClassName::class 之间的区别吗?
<?php
// PHP 5.5
var_dump(get_class(new Datetime())); // string(8) "DateTime" 
var_dump(Datetime::class); // string(8) "Datetime" with lower t
3个回答

21

在PHP中,类名不区分大小写。

似乎get_class($obj)返回的是真实的类名(在 PHP 核心中),而::class返回的是用户代码中使用的类名。

<?php
// PHP 5.5
var_dump(get_class(new DaTeTImE())); // string(8) "DateTime" 
var_dump(DaTeTImE::class);           // string(8) "DaTeTImE"

// 来自PHP Team: '::class' 结构在编译时纯粹基于传入的类名来执行。它不会检查实际类名的拼写,甚至不会检查类是否存在。

<?php
echo dAtEtImE::class; // Output is "dAtEtImE"
echo ThisDoesNotExist::class; // Output is "ThisDoesNotExist"

3
另一个要注意的点是,get_class需要将实例作为参数,而::class可以直接在不初始化任何实例的情况下操作类定义。有时您可能希望获取类名而不必创建实例。

1
补充这个答案的内容,您不能在实例上使用::class,而可以使用get_class()。例如,如果您执行了$d = new DateTime(),则不能使用$d::class - AmbientCyan
@AmbientCyan 但是 ::class 也可以用于实例。 - Hazem Noor

-6

没有区别,这只是两种编程风格。


那么为什么 get_class(new Datetime()) 不严格等于 Datetime::class 呢? - Fabien Papet
你在哪里看到了不同之处? - Raphaël Vigée
Datetime和DateTime(带有大写T) - Fabien Papet
@Raphaël Vigée 他们可能会返回大小写不同的字符串,这可能会破坏你的代码。 - Cato Minor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接