Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是什么导致了这个奇怪的PHP致命错误?_Php - Fatal编程技术网

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

是什么导致了这个奇怪的PHP致命错误?,php,Php,我有一个通用记录器类,如下所示: class Logger { ... public function add($userId, $siteId, $logTypeId, $message) { $Log = LogMapper::create(); $Log->setUserId($userId); $Log->setSiteId($siteId); $Log->setLogTypeId($logTypeId); $Log-

我有一个通用记录器类,如下所示:

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();

    ...
  }

  ...

}    
以及日志类:

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类,因此自动加载没有中断。日志类的路径在自动加载器中是正确的……而且显然日志类已经加载了——否则会抛出“class'Log'notfound”错误


你知道是什么导致了这个错误吗?我确实在发行版中使用了eAccelerator。

很难说,我们看不到Log类或LogMapper。 您确定日志类具有setUserId()方法吗?
还有,为什么用大写字母命名变量$Log?

很难说,我们看不到Log类和LogMapper。 您确定日志类具有setUserId()方法吗?
还有,为什么用大写字母命名变量$日志?

由于您没有在此处发布您的
日志
类,因此任何人都可能做出的最佳猜测是您忘记在该类中编写
setUserId()
方法


我还可以猜测,每个加速程序都可能缓存了您的类。您可能需要重新启动web服务器以使更改生效,或者使用其他方法清除缓存。

由于您没有在此处发布
日志
类,因此任何人都可能会猜测您忘记在该类中编写
setUserId()
方法

我还可以猜测,每个加速程序都可能缓存了您的类。您可能需要重新启动web服务器以使更改生效,或者使用其他方法清除缓存。

只是一个快速猜测:

使用:

我想这将是一个真正的地图

//叫我笨蛋,但我还是找不到setUserId()方法? //在复制和粘贴代码时,您是否遗漏了它过时的

快速猜测一下:

使用:

我想这将是一个真正的地图

//叫我笨蛋,但我还是找不到setUserId()方法?
//在复制和粘贴代码时,您是否遗漏了它过时的

也许反射可以告诉您更多关于代码使用的实际
类日志的信息

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();
}

也许反射可以告诉您更多关于代码使用的实际
类日志的信息

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();
}
试试这个

如果($this->userId!==$userIdd)

使变量名称不同,有一天我遇到了一个很奇怪的问题。

试试这个

如果($this->userId!==$userIdd)



使变量名不同,有一天我遇到了一个很奇怪的问题。

不可能,但是您是否安装了PEAR的日志类?这是我不久前遇到的事情。我试图做一个“日志”类,但它与PEAR的冲突

远非如此,但您是否安装了PEAR的日志类?这是我不久前遇到的事情。我试图做一个“日志”类,但它与PEAR的冲突

这十几封电子邮件都是吗?如果不使用autoload,而是以其他方式测试类,是否仍然会出现问题?而且,最明显的是,setUserId()方法是否存在于类日志中?可能映射程序没有正确映射这些方法,这就是为什么日志类无法识别任何setUserId()方法的原因。实际上,我无法在本地重现该问题,因此我无法判断不使用自动加载程序是否有帮助。查看代码(我使用日志类定义进行了更新),看起来调用正确。事实上,这段代码在代码库中的其他地方也可以使用,但在一个地方,由于某种原因,它失败了。LogMapper是否委托给log类来设置用户ID?查看LogMapper类是否都是十几封电子邮件会有帮助吗?如果不使用autoload而是测试日志,问题还会出现吗以其他方式创建类?最明显的是,方法setUserId()是否存在于类日志中?可能映射程序没有正确映射这些方法,这就是为什么日志类无法识别任何setUserId()方法的原因。实际上,我无法在本地重现该问题,因此我无法判断是否使用autoloader有帮助。查看代码(我使用日志类定义进行了更新),看起来调用正确。事实上,这段代码在代码库中的其他地方也可以使用,但在一个地方,由于某种原因,它失败了。LogMapper是否委托给log类来设置用户ID?这有助于查看LogMapper类oops…发布它。这是我检查的第一件事。嗯…你有
setSiteId()
在那里,但不是
setUserId()
。根据您上面的评论,我将讨论一个eAccelerator问题。尝试重新启动您的web服务器。嗯……我不完全相信这是一个eAccelerator缓存问题,因为我从来没有遇到过通过重新启动web服务器或Apache解决的问题。哦……发布了这个问题。这是我检查的第一件事。嗯……您得到了
setSiteId()
在那里,但不是
setUserId()
。从您上面的评论来看,我将处理一个eAccelerator问题。尝试重新启动您的web服务器。嗯……我不完全相信这是一个eAccelerator缓存问题,因为我从未遇到过通过重新启动web服务器或Apache解决的问题。哦……发布了这个问题。这是我检查的第一件事。由我公司的naming约定,我们在标题框中命名对象实例。哎呀…发布了。这是我检查的第一件事。根据我公司的命名约定,我们在标题框中命名对象实例。是的…我今天分心了…我更新了帖子。很抱歉。相信我,我很想使用神奇的方法,但由于非技术原因,我不能。为什么?可以吗你不使用它们吗?包装器/映射器不会是“真正的”m