J'ai une classe générique Logger qui ressemble à ceci:Quelle est la cause de cette étrange erreur fatale PHP?
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();
...
}
...
}
Et la classe 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;
}
...
}
Outre la classe LogMapper:
class LogMapper extends DataMapper {
...
public static function create($row = false) {
return new Log($row);
}
public static function getById($id) {
...
}
}
Comme vous pouvez le voir , J'ai deux autres classes, LogMapper et Log, que Logger utilise pour écrire des enregistrements dans une base de données.
J'ai aussi un mécanisme qui m'envoie un courriel lorsqu'une erreur fatale se produit. J'ai reçu ce qui suit dans une douzaine de courriels:
Call to undefined method Log::setUserId()
Mon application utilise autoloading, et j'ai pensé que peut-être le problème, mais bien la classe Logger est en cours de chargement, et ainsi autoloading n'a pas rompu. Le chemin de la classe Log est correct dans l'autoloader ... et la classe Log a été chargée - sinon une erreur "Class 'Log' not found" aurait été lancée.
Des idées sur ce qui peut être à l'origine de cette erreur? J'utilise eAccelerator sur la version.
Les douzaines de courriels étaient-elles toutes? le problème persiste-t-il si vous n'utilisez pas autoload mais testez les classes d'une autre manière? Et, de toute évidence, la méthode setUserId() existe-t-elle dans la classe Log? –
Peut-être que le mappeur ne mappe pas correctement les méthodes, c'est pourquoi la classe Log ne peut reconnaître aucune méthode setUserId(). –
Je ne suis pas capable de reproduire le problème localement, donc je ne peux pas dire si l'utilisation de l'autoloader n'est pas utile. –