自定义Magento模块在一台服务器上而不是另一台服务器上出现致命错误

时间:2011-01-16 15:25:13

标签: php magento module fatal-error member-functions

我正在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()是位于我的模型文件中的公共函数。

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

谢谢!

2 个答案:

答案 0 :(得分:1)

如果在调用模型时出现“非对象”错误,则Magento尝试获取模型类时会出现问题,并且返回null。其原因并不总是很明显。如果这在普通LAMP堆栈上的工作方式相同,则问题很可能不在您的代码中。

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

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

如果这样可行,那么该文件是可读的,您将希望在该类名的解析中进行搜索。如果它不起作用,则您在自动加载或声明您的课程时遇到问题。

希望有所帮助!

谢谢, 乔

答案 1 :(得分:1)

分解。

你试过打电话

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

并且PHP告诉你它试图在非对象上调用方法批处理。这意味着

Mage::getModel('mymodule/mymodel')

没有按照预期的方式返回Model对象。

首先要做的是清除你遇到问题的服务器上的Magento缓存。如果您的Module的配置尚未加载到全局配置树中,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;
    }
}
...