【问题标题】:magento class zend_log not found找不到magento类zend_log
【发布时间】:2011-03-17 20:41:14
【问题描述】:

在magento中编写了一些帮助类之后,现在我遇到了这个问题,我收到了这个错误

致命错误:在第 33 行的 app\code\local\Uhma\Program\Helper\Data.php 中找不到类“Zend_Log”

在第 33 行我有这个

function WBSAPI_OnceProbe ()
{
    return ( $this->WBSAPI_CurlCall ( "once?action=probe" , &$result) );//LINE 33
}

我用返回调用的函数是这个

function WBSAPI_CurlCall ( $service , &$result=null )
{
    try {
        $s = curl_init();
            curl_setopt($s,CURLOPT_URL,MYWBSAPIURL.$service);
            curl_setopt($s,CURLOPT_POST,false);
            curl_setopt($s, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($s);
            curl_close($s);
        $result = json_decode ( $output , TRUE );
        if (!is_array($result)) return (false);
        if (!key_exists('status',$result)) return (false);
        if ($result['status'] != 0) return (false);

        return ( true );
    } catch ( Exception $e ) {
        return ( false );
    }
} 

我在谷歌已经有一段时间了,有人说这是我的助手中的一个函数,它覆盖了 magento 的一个函数,我一开始就把 WBSAPI_ 放在我的所有函数中,所以,这不可能是原因,我一直收到同样的错误,我不知道还能尝试什么,这里需要一些帮助

如果有帮助,我的文件中还有其他一些定义,类似这样的

define ('MYWBSAPIURL','wbsapi.withings.net/');
define ('MYAPIURL','scalews.withings.net/cgi-bin/');

define ('pound',0.453592);
define ('inch', 0.0254);
class Uhma_Program_Helper_Data extends Mage_Core_Helper_Abstract{
    //CLASS CONTENT
}

谢谢

【问题讨论】:

    标签: php magento


    【解决方案1】:

    您收到该错误的原因是

    1. 您的 PHP 代码会产生警告
    2. Magento 运行时错误处理最高可达 11
    3. Magento 尝试记录错误,但找不到类。

    有问题的代码是

    $this->WBSAPI_CurlCall ( "once?action=probe" , &$result) );
    

    您在调用时通过引用传递变量 (&$result)。这在现代版本的 PHP 中已被贬低。如果没有自定义错误处理,您将收到类似

    的警告
    PHP Warning:  Call-time pass-by-reference has been deprecated;
    

    所以,请传入$result,不要使用&。鉴于您的方法在其原型中将参数声明为传递引用,这样做不会在功能上更改您的代码。这应该可以解决您眼前的问题。

    Magento 给你这个错误的更大原因是它的自定义错误处理程序。

    #File: app/code/core/Mage/Core/functions.php
    function mageCoreErrorHandler($errno, $errstr, $errfile, $errline)
    {
        ...
        if (Mage::getIsDeveloperMode()) {
            throw new Exception($errorMessage);
        } else {
            Mage::log($errorMessage, Zend_Log::ERR);
        }
    }
    

    由于您不在developer mode 中工作,Magento 尝试使用常量Zend_Log 作为其类型来记录错误。问题是(或似乎是)如果您的错误在 Magento 引导/调度过程中发生得太快,Zend_Log 尚未加载并且自动加载器不会处理它。这就是你得到错误的原因。

    应该修复您的代码,使其不使用调用时按引用传递(从您的调用代码中删除 &$result,但不要从函数定义中删除)。如果您不想这样做,您可以尝试自己更早地包含lib/Zend/Log.php。我认为这是一个坏主意,所以我将把这些方法作为练习留给读者。

    另外,对于那些不熟悉“调用时通过引用传递”这个术语的人来说,这意味着在调用方法时应该通过引用传递一个变量

    foo(&$bar);
    

    传递对函数的引用

    $bar = &baz;
    foo($bar);
    

    或者在方法的原型中声明一个参数,表明它应该通过引用传递

    public function applyInApp(&$content)
    {
    }
    

    仍然是合法的 PHP 代码。

    【讨论】:

    • 我删除了我通过引用调用的每一行,我现在没有收到错误,但我将不得不更改我的所有代码,或者还有另一种方法,也许是自定义错误处理,怎么能我这样做
    • 更新了答案,对正在发生的事情进行了更详细的解释。是的,从调用函数中删除 &$result,但不是函数定义。
    • 尽可能使用命令行php -l (lint)。事实证明,当我们搜索警告时,我非常方便。顺便说一句,感谢@Alan 的全面回答,它为我节省了几个小时!
    • 不幸的是 Magento 核心充满了通过引用传递的变量。
    • @Tim — Magento 的核心中是否有通过引用传递的调用时间?在哪里?
    【解决方案2】:

    确保您的方法名称不是通用的。 我发现问题出在我的自定义类中的一种方法的名称上。该方法称为 getData()。我一改名,问题就解决了。所以,很可能,问题出在你的方法命名上。尝试重命名可疑的函数名称。来源:

    http://www.netismine.com/magento/fatal-error-class-zend_log-not-found

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 2019-04-14
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 2012-09-23
      相关资源
      最近更新 更多