2016-07-14 28 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

相關問題