Php 通过getModel调用函数与通过对象直接调用

Php 通过getModel调用函数与通过对象直接调用,php,magento,magento-1.9,Php,Magento,Magento 1.9,在Magento中,如果我们想从模型调用函数,那么我们更喜欢使用 Mage::getModel('moduleName/className')->functionName();但是,我们也可以直接使用Namespace_ModuleName_Model_ClassName::FunctionName()实现它 我知道根据Magento我们必须使用getModel,但我检查了有人使用direct Php方法调用函数,并说“这是相对于Mage::getModel方法的首选方法,因为我们不需要为一个简

在Magento中,如果我们想从模型调用函数,那么我们更喜欢使用 Mage::getModel('moduleName/className')->functionName();但是,我们也可以直接使用Namespace_ModuleName_Model_ClassName::FunctionName()实现它

我知道根据Magento我们必须使用getModel,但我检查了有人使用direct Php方法调用函数,并说“这是相对于Mage::getModel方法的首选方法,因为我们不需要为一个简单数组实例化整个模型。如果我们要使用Mage::getModel表达式,模型首先需要实例化(执行其构造函数),然后再执行“functionname”方法,该方法只返回一个数组,没有复杂的逻辑。这样做速度更快,而且还限制了返回数组的逻辑执行。”


请建议使用直接调用函数的更好方法和优缺点。

如果您调用这样的方法:
Namespace\u ModuleName\u Model\u ClassName::FunctionName()
,那么您假设这是一个静态方法。只有静态方法可以这样调用

请参见此处。其思想是静态方法是无状态的,不需要对象的上下文来运行。在这种情况下,确实不需要实例化对象,因为静态方法不应该调用实例方法,所以它们不使用$this关键字

Magento中,情况有点不同,因为
getModel
提供了一个非常重要的特性:类重写

如果您使用
Mage::getModel('moduleName/className')
,则Magento会使用其从config.xml重写的类将此名称解析为PHP类。这意味着您可以在
local
命名空间中重写核心或社区类,Magento将在代码中的任何地方使用您的类,而不是旧类

记住这一点,您很容易看到使用静态方法并直接调用它们的缺点:您将无法重写它们


如果您想用静态方法修改代码,您唯一的“干净”解决方案是在
app/code/local/Original/Module
中复制整个文件;多次这样做会使升级变得困难。

谢谢您的回复。我无法重写模型,还有其他缺点吗?Magento特定:没有,没有其他缺点!