В чем причина этой странной фатальной ошибки PHP? - PullRequest
0 голосов
/ 18 декабря 2009

У меня есть общий класс 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();

    ...
  }

  ...

}    

И Журнал класса:

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 ]

4 голосов
/ 18 декабря 2009

Длинный выстрел, но у вас установлен класс журнала PEAR? Это то, что я столкнулся некоторое время назад. Я пытался создать класс 'Log', но он сталкивался с PEAR.

1 голос
/ 18 декабря 2009

Может быть, отражение может рассказать вам немного больше о фактическом 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();
}
1 голос
/ 18 декабря 2009

Поскольку вы не публикуете здесь свой класс Log, лучшее, что может сделать любой, - вы забыли написать метод setUserId() в этом классе.

Я также могу предположить, что eAccelerator может кэшировать ваш класс. Возможно, вам потребуется перезапустить веб-сервер, чтобы изменения вступили в силу, или использовать другой метод очистки кэша.

0 голосов
/ 18 декабря 2009

попробуйте

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

сделать имена переменных разными, у меня однажды была такая странная проблема.

0 голосов
/ 18 декабря 2009

Просто быстрое предположение:

Использование:

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

Полагаю, это будет настоящее отображение.

// Назовите меня глупо, но я все еще не могу найти метод setUserId ()? // Вы пропустили это, копируя и вставляя код? Устаревшие

0 голосов
/ 18 декабря 2009

Трудно сказать, мы не можем видеть ни класс Log, ни LogMapper. Вы уверены, что в классе Log есть метод setUserId ()? Кроме того, почему вы называете переменную в верхнем регистре? $ Log

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...