Yii2中::class与::className()的区别是什么?

10

我知道两种方式都可以得到相同的结果,但我想了解它们的性能表现。

我不确定,但我认为:

  • "MyClass::className()" 会导致该类文件被加载(它是 Yii 函数,其主体只是 get_called_class())。

  • "MyClass::class" 我想这是 PHP 原生类属性,不会加载类 PHP 文件,而是基于当前命名空间或 use 返回其名称。

请让我知道我是否正确?或者请提供更多知识点。

有很多地方我们只想要完全合格的类名,即使在那个时候不会使用它。但我也不喜欢放置硬编码字符串(因为很难重构)。


一个推荐的做法是调用 Xyz::className() 方法来获取类名字符串,这样你就能获得 IDE 的自动补全支持和编译阶段的错误检测。 - Muhammad Shahzad
2个回答

5

我刚刚发现我的想法是正确的。

PHP原生类属性有助于性能提升..(PHP 5.5+)

请参考这里 http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class.class.name

所以这不会导致类文件被加载,即使类不存在,它也会返回完整的className

注意:使用::class进行类名解析是一种编译时转换。这意味着在创建类名字符串时还没有自动加载。因此,即使类不存在,类名也会扩展。在这种情况下不会出现错误。


2
Yii函数是抽象的,因此可以在将来进行更改。使用::class会禁用此功能。您还应该对这两个版本进行基准测试。 - topher

0

你知道关于 MyClass::class 的任何参考资料吗? - dev.meghraj
我很了解Yii的className以及性能方面的所有内容,我想更多地了解关于PHP原生类属性的知识。 - dev.meghraj
当然,但我认为性能并不重要,因为 Yii 使用自动加载。 - devOp
我知道get_called_class()。我说过get_called_class()被使用了...但是你声称性能有问题,这是错误的...因为我刚刚发现一个答案,::class不会加载PHP文件,而::className()会导致文件加载...那么你怎么能说性能没有受到影响呢? - dev.meghraj

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