2016-07-14 70 views
5

我知道两者都有同样的结果,但我期待听到有关表现。Yii2中:: class vs :: className()的区别?

我不知道,但我认为..

  • MyClass::className()”会导致类文件被加载,以及(其Yii的功能谁的身体只是单纯地get_called_class()

  • MyClass::class “我认为这个php的本地类属性不会加载类php文件,只是基于当前命名空间或use返回其名称。

让我知道我是否正确?或请强调你的知识。

有许多地方,我们只是想要完全合格的班级名称,即使它不会被使用的时间。但我也不喜欢把硬编码字符串(由于硬重构)

+0

建议的做法是调用Xyz :: className()来获取类名字符串,以便在编译阶段可以接收IDE自动完成支持以及错误检测。 –

回答

4

是的,我刚刚发现我是对的。

PHP的原生类属性是性能节能..(PHP 5.5+)

看到这里http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class.class.name

所以这不会导致加载的类文件,这样即使该类不存在,它将返回完整的类名称

注意:使用:: class的类名解析是编译时间 转换。这意味着当时类名字符串是 创建的自动加载尚未发生。因此,即使类不存在,类名称 也会展开。 这种情况下没有发出错误。

+2

Yii函数是抽象的,所以可以在将来改变。使用':: class'将禁用此功能。您还应该对两个版本进行基准测试。 – topher

0

get_called_class()是用于静态方法。

Yii使用autoloading,所以无论如何都加载了类。所以这两个命令之间没有明显的时间差异。

在自己的代码中查看性能更重要。并检查并了解Yii 2.0的这些性能调整链接:Yii2-Docs: Performance TuningYii2-Docs:Lazy Loading and Eager Loading

+0

你知道任何关于MyClass :: class –

+0

的参考吗?我很了解Yii的className和所有关于性能的信息,我想知道更多关于该php的本地类属性 –

+0

的确定,但我声称性能并不重要,因为yii使用自动加载。 – devOp

相关问题