[PHP] Dopisywanie do pliku czyści plik

0

Napisałem sobie dawno temu klasę do logowania zdarzeń, no i chyba zapomniałem w niej przetestować możliwość dodawania wpisów do istniejącego pliku logu, bo coś nie działa jak dzisiaj chciałem wykorzystać w innym projekcie. Za nic nie mogę dojść co jest u licha źle, skoro taki samo kod, ale normalnie, a nie jako metody klasy działa bez problemów.

class Logger
  {
      /**
       * @var mixed Wskaźnik na plik logu
       * @access private
       */
      var $file;
      
      /**
       * @var string Typ logowania (append, read, write)
       * @access private
       */
      var $log_mode = 'write';
      
      /**
       * @var string Ścieżka do pliku wywołującego klasę
       * @access private
       */
      var $in_file = '';
      
      /**
       * @var string Znak(i) końca linii przy zapisie dziennika
       * @access public
       */
      var $end_line_string = "\r\n";
      
      /**
       * Konstruktor klasy Logger
       * @param string $file Nazwa lub ścieżka pliku wywołującego obiekt klasy logującej
       * @access public
       */
      function Logger($file = '')
      {
          if ($file == '')
              $this->in_file = $file;
      }
      
      /**
       * Ładowanie (lub tworzenie) pliku logu)
       * @param string $file_name Ścieżka do pliku logu
       * @param string $mode Tryb otwarcia logu (append, write, read)
       * @return bool Czy operacja się powiodła
       * @access public
       */
      function load_log_file($file_name, $mode = 'append')
      {
          $this->log_mode = $mode;
          echo $mode;
          if (!file_exists($file_name) && ($mode == 'read'))
              return false;
              
          switch($this->log_mode)
          {
              case 'append': $this->file = fopen($file_name, 'a+');
              case 'write':  $this->file = fopen($file_name, 'w');
              case 'read':   $this->file = file($file_name);
              default:       $this->file = fopen($file_name, 'w');
          }
          
          if (!$this->file)
              return false;
          else
              return true;
      }
      
      [ciach, tutaj funkcja format_string, ona działa bez problemów]
          
      /**
       * Dodanie wpisu do dziennika
       * @param string $entry Wpis do dziennika (z opcjonalnymi zmiennymi)
       * @param bool $format [Opcjonalny] Czy zamieniać zmienne na ich wartości
       * @param int $line Linia, w której wywoływane jest zdarzenie logowania
       * @access public
       */
      function add_log_entry($entry, $format, $line)
      {
          if ($format)
              $entry = $this->format_string($entry, $line);
          
          if (!fwrite($this->file, $entry . $this->end_line_string))
              return false;
          else
              return true;
      }
      
      [ciach, tutaj funkcje do odczytu, nieważne]
      
      /**
       * Zakończenie zapisu i zamknięcie pliku
       * @access public
       */
      function close_log_file()
      {
          if (($this->log_mode == 'write') || ($this->log_mode == 'append'))
             fclose($this->file);
      }

  }

Co u licha zrobiłem źle, że plik jest czyszczony, a nie jest dopisywane, jeżeli wywołuję load_log_file z parametrem mode na 'append'?

  $log = new Logger(__FILE__);
  $log->load_log_file('test.log', 'append');
  $log->add_log_entry('test', false, 0);
  $log->close_log_file();

^^ działa źle

  $f = fopen('test.log', 'a');
  fwrite($f, 'test2');
  fclose($f);

^^ działa dobrze

0

to może nie sprawdzaj
echo $mode;
bo to wiadome co będzie zawierać, lepiej sprawdź
echo $this->log_mode;

i może zamienić var na protected i $this-> na self:: i function Logger na __construct jeśli korzystasz z PHP5

// tomkiewicz - no tak :-D [glowa]

0

a po kazdym case nie powinno byc break?

0

Powinno być. [glowa] Dzięki Tomkiewicz, działa.
Nienawidzę sytuacji gdy się godzinę głowię nad głupim błędem.

Adamo: Ja już się róznych rzeczy przyczepiałem, nawet przekazywanie wartości wolałem sprawdzać :) A co do PHP5 - akurat do skryptu w jakim ma być ta klasa wykorzystana to muszę być kompatybilny z PHP 4. Stąd też nie ma zadnych protected, czy public tylko wszystko jest opisane w komentarzach phpDocumentatora :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1