2009-12-17 6 views
0

У меня есть универсальный класс Logger, который выглядит следующим образом:Что вызывает эту странную 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(); 

    ... 
    } 

    ... 

}  

А класса 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 корректен в автозагрузчике ... и, очевидно, класс журнала был загружен - в противном случае была бы выбрана ошибка «Class» Log «not found».

Любые идеи, которые могут вызывать эту ошибку? Я использую eAccelerator в выпуске.

+0

Были ли все дюжины писем? проблема остается, если вы не используете autoload, но проверяете классы каким-то другим способом? И, что наиболее очевидно, существует ли метод setUserId() в классе Log? –

+0

Возможно, картограф неправильно отображает методы, поэтому класс Log не может распознать какой-либо метод setUserId(). –

+0

Я не могу воспроизвести проблему локально, поэтому не могу сказать, помогает ли использование автозагрузчика. –

ответ

4

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

+0

HMMMMM .... очень хороший вывод. Я собираюсь изучить это. –

+0

Спасибо ОЧЕНЬ за ваш пост. В этом была проблема: у PayPal есть класс «Log». Если бы я мог вас поцеловать, хорошо , Я все равно не буду, но я отмечу это как ответ. –

+0

+1 Длинный выстрел, но хорошая работа! – zombat

0

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

+0

Что случилось с именами переменных верхнего регистра? – zombat

+0

К сожалению ... написал это. Это было первое, что я проверил. По соглашению об именах моей компании мы называем экземпляры объектов в заголовке. –

1

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

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

+0

К сожалению ... написал это. Это было первое, что я проверил. –

+0

Хм ... у вас есть 'setSiteId()' там, но не 'setUserId()'. – zombat

+0

Crud ... Я обновил сообщение. –

0

Просто быстро догадка:

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

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

Это было бы реальное отображение, я думаю.

// Назовите меня глупым, но я все еще не могу найти метод setUserId()? // Вы оставили это, а копия & вставляете код? НАРУЖНЫЕ

+0

Да ... Сегодня меня отвлекает ... Я переделал сообщение. Извини за это. Поверьте мне, я бы хотел использовать магические методы, но я не могу из-за нетехнических причин. –

+0

Почему? Не могли бы вы их использовать? Обертка/картограф не будет «реальным» картографом, если он не сможет использовать магические методы ^^ –

+0

Правда. Мой сотрудник был просто не убежден по какой-то причине использовать их. –

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

Я бы полностью это сделал, за исключением того, что я не могу проверить с помощью выпуска :( –

-1

попробовать этот

если ($ this-> USERID! == $ userIdd)

сделать имена вар diffrent, я была такая странная проблема один день.

+0

Ваш «ответ» не имеет абсолютно никакого отношения к проблеме. Проблема связана с неопределенным методом, но ваш ответ пытается решить некоторые несуществующие проблемы с имена переменных. –

Смежные вопросы