1

我正在 Magento 中创建自己的自定义模块,并且在 Litespeed 服务器(PHP v5.2.14)上进行测试期间,我得到了一个Fatal Error: Call to a member function batch() on a non-object in ../../../BatchController.php on line 25在另一台 linux 服务器和 wamp 服务器(PHP v5.2.11)上测试期间没有出现的模块。

这把我难住了。我猜它与服务器配置有关,而不是代码本身。但我只是猜测。我希望这里有人可以告诉我。

除了 php 版本和环境之外,我能看到的唯一真正的主要区别是错误所在的服务器使用的是 Suhosin 补丁。但这会导致这种情况吗?

有问题的行Mage::getModel('mymodule/mymodel')->batch();是包含在 IF 语句中的行。batch()是位于我的模型文件中的公共函数。

如果您需要更多代码,请告诉我。

谢谢!

4

2 回答 2

1

如果您在调用模型时收到“非对象”错误,则 Magento 尝试获取您的模型类时存在问题,并且它返回 null。其原因并不总是显而易见的。如果这在普通 LAMP 堆栈上同样有效,那么问题很可能不在您的代码中。

我的第一个猜测是该文件没有适当的权限。否则,它可能与解析类名有关。您可以通过像这样直接调用插件来临时测试它:

$obj = new Mynamespace_Mymodule_Model_Mymodel();
$obj->batch();

如果这可行,那么该文件是可读的,并且您将想要深入研究该类名的解析。如果它不起作用,则说明自动加载或类的声明存在问题。

希望有帮助!

谢谢,乔

于 2011-01-16T16:35:59.660 回答
1

把它分解。

你试过打电话

Mage::getModel('mymodule/mymodel')->batch();

并且 PHP 告诉你它试图在non-object上调用方法批处理。这意味着

Mage::getModel('mymodule/mymodel')

没有以应有的方式返回 Model 对象。

首先要做的是清除您遇到问题的服务器上的 Magento 缓存。如果您的模块配置尚未加载到全局配置树中,Magento 将尝试实例化 Mage_Core_Model_Mymodel,但失败。

第二步是确保你的模块app/etc/module文件就位。

第三步是在实例化对象的方法中添加一些调试(假设是 1.4 分支)并确定Magento 无法创建对象的原因

File:   app/code/core/Mage/Core/Model/Config.php
...
public function getModelInstance($modelClass='', $constructArguments=array())
{
    $className = $this->getModelClassName($modelClass);
    if (class_exists($className)) {
        Varien_Profiler::start('CORE::create_object_of::'.$className);
        $obj = new $className($constructArguments);
        Varien_Profiler::stop('CORE::create_object_of::'.$className);
        return $obj;
    } else {
        #throw Mage::exception('Mage_Core', Mage::helper('core')->__('Model class does not exist: %s.', $modelClass));
        return false;
    }
}
...    
于 2011-01-16T19:47:18.260 回答