Bu ne garip bir PHP ölümcül hata neden oluyor?

5 Cevap

Şöyle bir genel Logger sınıfı vardır:

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();

    ...
  }

  ...

}

Ve Log sınıfı:

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;
  }

  ...

}

Yanı sıra LogMapper sınıf olarak:

class LogMapper extends DataMapper {

  ...

  public static function create($row = false) {
    return new Log($row);
  }

  public static function getById($id) {
    ...
  }

}

Gördüğünüz gibi, ben Logger bir veritabanına kayıt yazmak için kullandığı diğer iki sınıfları, LogMapper ve Günlükler var.

Ben de önemli bir hata e-postaları bana oluşan bir mekanizması var. Ben bir düzine e-postalar hakkında aşağıdaki aldı:

Call to undefined method Log::setUserId()

Benim uygulama autoloading kullanır, ve ben ilk bu sorun olabilir, ama açıkça Logger sınıfı yüklenen ediliyor düşündüm ve bu yüzden autoloading kırmadı. Log sınıfı için yol robotun doğru ... ve açıkça Günlüğü sınıf yüklenmiş - aksi takdirde "Sınıf 'Log' bulunamadı" hata atılmış olurdu.

Herhangi bir fikir ne bu hataya neden olabilir? Ben sürüm hakkında eaccelerator kullanırım.

5 Cevap

Uzun atış, ancak PEAR'ın Log sınıf yüklü? Bu geri bir süre koştu şeydir. Ben bir 'Giriş' sınıfı yapmaya çalıştım ama ARMUT en çarpışarak edildi.

Eğer burada Log sınıf sonrası vermedi beri, herkes muhtemelen yapabileceğiniz en iyi tahminim bu sınıfta bir setUserId() yöntem yazmak unutmuş olmasıdır.

Ben de eAccelerator sınıf önbelleğe sahip olabileceği bir tahmin alabilir. Bu değişikliklerin etkili olması, veya önbelleği temizleyerek diğer bazı yöntemi kullanmak için, web sunucuyu yeniden başlatmanız gerekiyor mümkündür.

Belki yansıma size gerçek class Log kodunuz tarafından kullanılan hakkında biraz daha söyleyebilir.

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

Sadece hızlı bir tahmin:

Kullanın:

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

Bu gerçek bir eşleme olurdu sanırım.

//Call me stupid, but I still can not find the setUserId() method? //Did you leave it out, while copy&pasting the code? OUTDATED

Bu deneyin

if ($ this-> kullanıcı kimliği! == $ userIdd)

ben bir gün böyle garip bir sorun vardı diffrent, var isimleri olun.