我有一个通用的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。
答案 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名称不同,我有一天会遇到这样一个奇怪的问题。