致命错误:在非对象上调用成员函数isUploaded()

时间:2014-10-31 09:27:05

标签: php zend-framework fatal-error

我正面临一条错误消息:

Fatal error: Call to a member function isUploaded() on a non-object in /www/htdocs/nether/http/123factuur/application/controllers/Helpers/ImportXls.php on line 30 

由于我正在调用对象中不存在的方法,因此弹出此错误消息。但我确信isUploaded()确实存在。

函数isUploaded在类Zend_Form_Element_File中定义。要检查$xlsZend_Form_Element_File的实例,我是否调试了$xls变量。

Zend_Debug::dump($xls); //OUTPUT: object(Zend_Form_Element_File)#141 (29) {
exit;

第30行看起来像这样:

if ( $xls->isUploaded() ) {

我做的第一件事就是检查表达式值。

Zend_Debug::dump($xls->isUploaded()); //the output was: bool(true)
exit;

然后我检查了$xls变量的类型。

echo gettype($xls); //the output was object
exit;

我不完全理解错误。也许,我没有解释错误消息,因为它应该被解释。无论如何,需要援助。

代码段: 在控制器:

public function importAction() {
        $form = $this->getImportFrom();
        $this->view->form = $form;
        $this->view->allowedHeaders = array();

        $this->importInvoices($form);
        $this->importInvoiceArticles($form);
        $this->importInvoiceServices($form);
        foreach ($this->_lookupIssues as $issue) {
            $this->_flashMessenger->addMessage($issue);
        }
    }


public function importInvoiceArticles($form) {
        $model = 'Invoice_article';
        $config = Zim_Properties::getConfig($model);
        $Model = new Zim_Model($model, $config->model);
        $headerMapping = array_flip(array_intersect_key($Model->getHeaders(true), array_flip($this->_allowedArticleImportHeaders)));
        $this->getHelper('ImportXls')->handleImport($form, $headerMapping, $Model->getName(), $this->_modelName, null, null, array($this, 'saveImportedArticleData'), 'invoiceArticle');
    }

帮助者:

class F2g_Helper_ImportXls extends Zend_Controller_Action_Helper_Abstract {

public function handleImport($form, $allowedHeaders, $tableName, $modelName, $onDuplicateImportCallback, $importMethod = null, $saveMethod = null, $name = 'xls') {
        if ($this->getRequest()->isPost()) {
            $xls = $form->getElement($name);
            if ( $xls->isUploaded() ) {
               //some code
            }  
        }
    }
}

2 个答案:

答案 0 :(得分:3)

我非常确定handleImport()方法被多次调用,可能在循环内,可能具有$ name参数的不同值。你回调变量并死掉它以便调试它,如果$ name的提供值在第一次运行时是正确的 - 这完全有效 - 但是因为你杀了脚本 - 你不能得到关于后续调用的任何调试信息。

在调用之前确保对象具有该方法。您可以调用method_exists()或instanceof来进行确定。

代码:

if ($xls instanceof Zend_Form_Element_File) {
    // object of correct type - continue (preferred version)
}

// or

if (method_exists($xls, 'isUploaded')) {
    // avoids the error, but does not guarantee that 
    // other methods of the Zend_Form_Element_File exist
}

答案 1 :(得分:1)

将此添加到您的条件中以避免致命错误:

if ( !empty($xls) && is_object($xls) && $xls->isUploaded() ) {
    // do your job with serenity :)
}