2016-02-26 215 views
1

在Magento中,如果我們想從模型中調用函數,那麼我們更喜歡使用 Mage :: getModel('moduleName/className') - > functionName();但我們也可以直接使用Namespace_ModuleName_Model_ClassName :: FunctionName();通過getModel調用函數與通過對象直接調用

我知道,根據Magento,我們必須使用getModel,但我查了一個人使用直接Php方法來調用函數,並說「這是首選反對Mage :: getModel的方式,因爲我們不需要實例化如果我們使用Mage :: getModel表達式,模型首先需要在執行「functionname」方法之前實例化(執行它的構造函數),該方法只返回一個數組並且沒有複雜的邏輯。這樣它的速度更快,並且它還限制了執行的邏輯返回steps數組。

請提出使用哪種優選方式和使用直接調用功能的優勢/劣勢。

回答

3

如果你正在調用這樣的方法:Namespace_ModuleName_Model_ClassName::FunctionName(),那麼你假設這是一個靜態方法。只有靜態方法可以像這樣調用。

請參閱這裏查看a good write-up on when to use static methods。這個想法是靜態方法是無狀態的,並且不需要運行對象的上下文。在這種情況下,確實不需要實例化對象,因爲靜態方法不應該調用實例方法,所以它們不使用$ this關鍵字。

Magento,事情有點不同,因爲getModel給你一個非常重要的功能:類重寫。

如果你做Mage::getModel('moduleName/className'),Magento使用它的config.xml中的類重寫,將這個名字解析爲一個PHP類。這意味着您可以在您的local名稱空間中重寫核心或社區類,並且Magento將在代碼中的任何地方使用您的類,而不是原來的類。

牢記這一點,您可以很容易地看到使用靜態方法並直接調用它們的缺點:您將無法重寫它們!

如果您想修改靜態方法中的代碼,您唯一的'乾淨'解決方案是複製整個文件app/code/local/Original/Module;多次這樣做會使升級變得困難。

+0

感謝您的回覆。我不能重寫模型,還有其他缺點嗎? –

+0

Magento特定:不,沒有別的! – VladFr