2016-02-26 193 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