2009-12-17 5 views
0

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.

+0

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? –

+0

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(). –

+0

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. –

Répondre

4

Plan long, mais avez-vous installé la classe Log de PEAR? C'est quelque chose que j'ai couru il y a quelque temps. J'ai essayé de faire une classe 'Log' mais elle était en collision avec PEAR.

+0

HMMMMM .... très bonne déduction –

+0

Merci beaucoup pour votre article, c'est le problème: PayPal a un cours 'Log' Si je pouvais t'embrasser, eh bien , Je ne le ferais toujours pas, mais je vais marquer cela comme la réponse –

+0

+1 Long shot, mais bon travail! – zombat

0

Il est difficile de dire que nous ne pouvons pas voir la classe Log ni le LogMapper. Vous êtes sûr que la classe Log a la méthode setUserId()? Aussi, pourquoi nommez-vous la variable en majuscules? $ Log?

+0

Quel est le problème avec les noms de variables en majuscules? – zombat

+0

Oups ... posté cela. C'était la première chose que j'ai vérifiée. Par la convention de dénomination de mon entreprise, nous nommons des instances d'objet dans le casse du titre. –

1

Puisque vous n'avez pas publié votre classe Log ici, la meilleure estimation que vous puissiez faire est que vous avez oublié d'écrire une méthode setUserId() dans cette classe.

Je peux également supposer qu'eAccelerator peut avoir votre classe en cache. Il est possible que vous deviez redémarrer votre serveur Web pour que les modifications prennent effet, ou utiliser une autre méthode pour vider le cache.

+0

Oups ... posté que. C'était la première chose que j'ai vérifiée. –

+0

Hmm ... vous avez 'setSiteId()' ici, mais pas 'setUserId()'. – zombat

+0

Crud ... J'ai re-mis à jour le poste. –

0

Juste une supposition rapide:

Utilisation:

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

Ce serait une véritable cartographie, je suppose.

// Appelez-moi stupide, mais je n'arrive toujours pas à trouver la méthode setUserId()? // L'avez-vous omis, alors que copiez & en collant le code? OUTDOATED

+0

Ouais ... Je suis distrait aujourd'hui ... J'ai re-mis à jour le poste. Désolé pour ça. Croyez-moi, j'aimerais utiliser des méthodes magiques, mais je ne peux pas pour des raisons non techniques. –

+0

Pourquoi? Tu ne pourrais pas les utiliser? Un wrapper/mapper ne sera pas un "vrai" mappeur s'il ne peut pas utiliser de méthodes magiques ^^ –

+0

True. Mon collègue n'était pas convaincu pour une raison quelconque de les utiliser. –

1

Peut-être que la réflexion peut vous en dire un peu plus sur le class Log utilisé par votre code.

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

Je le ferais totalement, sauf que je ne peux pas tester en utilisant la version :( –

-1

essayer

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

font les noms var diffrent, j'ai eu un problème bizarre un jour.

+0

Votre "réponse" n'a absolument rien à voir avec le problème.Le problème implique une méthode indéfinie, mais votre réponse est d'essayer de résoudre un problème inexistant avec –

Questions connexes