是什么导致这个奇怪的PHP致命错误?

时间:2009-12-17 21:01:53

标签: php

我有一个通用的Logger类,如下所示:

class Logger {

  ...

  public function add($userId, $siteId, $logTypeId, $message) {
    $Log = LogMapper::create();
    $Log->setUserId($userId);
    $Log->setSiteId($siteId);
    $Log->setLogTypeId($logTypeId);
    $Log->setMessage($message);
    $Log->save();

    ...
  }

  ...

}    

Log类:

class Log {

  public function setUserId($userId) {
    if ($this->userId !== $userId) {
      $this->userId = $userId;
    }

    return $this;
  }

  public function getUserId() {
    return $this->userId;
  }

  public function setSiteId($siteId) {
    if ($this->siteId !== $siteId) {
      $this->siteId = $siteId;
    }

    return $this;
  }

  public function getSiteId() {
    return $this->siteId;
  }

  ...

}

和LogMapper类一样:

class LogMapper extends DataMapper {

  ...

  public static function create($row = false) {
    return new Log($row);
  }

  public static function getById($id) {
    ...
  }

}

正如您所看到的,我还有另外两个类,LogMapper和Log,Logger使用它们将记录写入数据库。

我还有一种机制可以在发生致命错误时通过电子邮件发送给我。我收到了以下十几封电子邮件:

Call to undefined method Log::setUserId()

我的应用程序使用自动加载,我首先想到的可能是问题,但显然正在加载Logger类,因此自动加载没有破坏。 Log类的路径在自动加载器中是正确的......显然已经加载了Log类 - 否则会抛出“Class'Log'not found”错误。

任何可能导致此错误的想法?我在发布时使用了eAccelerator。

6 个答案:

答案 0 :(得分:4)

远射,但是你安装了PEAR的Log类吗?这是我在一段时间后遇到的事情。我试图制作一个“Log”类,但它与PEAR相撞。

答案 1 :(得分:1)

由于您未在此处发布Log课程,因此您可能做出的最佳猜测是您忘记在该课程中编写setUserId()课程。

我还可以猜测eAccelerator可能会让你的课程被缓存。您可能需要重新启动Web服务器才能使更改生效,或者使用其他一些清除缓存的方法。

答案 2 :(得分:1)

也许反射可以告诉您更多关于代码使用的实际class Log的内容。

public function add($userId, $siteId, $logTypeId, $message) {
  $Log = LogMapper::create();
  if ( !method_exists($Log, 'setUserId') ) {
    $ro = new ReflectionObject($Log);
    echo 'class defined in ', $ro->getFilename(), ' @ ', $ro->getStartLine(), "\n";
    foreach($ro->getMethods() as $rm) {
      echo '  method ', $rm->name, " \n";
    }
    die('----');
  }
  $Log->setUserId($userId);
  $Log->setSiteId($siteId);
  $Log->setLogTypeId($logTypeId);
  $Log->setMessage($message);
  $Log->save();
}

答案 3 :(得分:0)

很难说,我们看不到Log类和LogMapper。 你确定Log类有setUserId()方法吗? 另外为什么用大写命名变量? $登录?

答案 4 :(得分:0)

快速猜测:

使用:

public function __set($name,$value)
{
$this->{preg_replace('^set','',$name)} = $value; 
}

我想这是一个真实的映射。

//叫我傻,但我还是找不到setUserId()方法? //在复制和粘贴代码的时候,你把它遗漏了吗?的过时

答案 5 :(得分:-1)

试试这个

if($ this-> userId!== $ userIdd)

使var名称不同,我有一天会遇到这样一个奇怪的问题。