2014-01-16 3 views
0

Я пытаюсь отладить некоторые сценарии, которые я сделал, которые не работают. Я хочу реализовать самую основную функцию регистрации (я имею в виду файлы журналов), которую я использую в скрипте главной страницы в своих файлах классов.Функции обработки файлов в PHP-классе

Однако это не работает, например, эти простые линии:

if ($file = fopen('C:/wamp/www/xxxx/Logs/General/' . date('Ymd') . '.log', 'a+') { 

    fputs($file, "[" . date('d/m/Y - H:i:s') . "]\t" . "[" . $type ."]\t" . "[" . $author . "]\t" . $message . "\r\n"); 
    fclose($file); 
} 
else 
{ 
    return false; 
} 

Работа отлично, если я их в функции PHP включены в верхней части моей главной страницы (например, в log.php файл). Howevr они не работают на всех, если они находятся в методе класса:

public function __contruct(array $connectionArgs) 
{ 
    if ($file = fopen('C:/wamp/www/xxxx/Logs/General/' . date('Ymd') . '.log', 'a')) { 
     fwrite($file, "test"); 
     fclose($file); 
    } 
    else 
    { 
     die("fail"); 
    } 

Я совершенно новой для ООП, так что я предполагаю, что это что-то делать с тем, как вызова такой функции в классе?

+0

Когда я говорю, не работаю, я имею в виду ничего возвращается и файл не создается или не обновляется – Sciid

+0

Вы действительно строите объект? Это способ заставить конструктор выполнить. – jeroen

+0

Также рассмотрим ['file_put_co ntents'] (http://php.net/file_put_contents) с 'FILE_APPEND'. – mario

ответ

1

Это не похоже на то, что вы ставите свой регистратор в определение класса или в функциональный код. Я предполагаю, что вы делаете что-то неправильно или, может быть, у вас есть ошибка.

Вот это рабочий пример

Class Logger 
{ 
    const PATH_TO_LOGS_DIRECTORY = 'C:/wamp/www/xxxx/Logs/General/'; 
    const FILE_DATE_SUFFIX = 'Ymd'; 
    private $handle; 

    public function log($what) { 
     $this->openFile(); 
     fwrite($this->handle, $what . PHP_EOL); 
    } 

    protected function openFile() { 
     if ($this->handle === null) { 
      $this->handle = fopen(self::PATH_TO_LOGS_DIRECTORY . date(self::FILE_DATE_SUFFIX) . '.log', 'a'); 
      if ($this->handle === false) { 
      throw new RuntimeException('Cannot open log file'); 
     } 
     } 
     register_shutdown_function(array($this, 'close')); 
    } 



    public function close() { 
     if($this->handle !== null) { 
      fclose($this->handle); 
     } 
    } 

} 

Несколько лишних вещей, которые вы должны заботиться о:

  1. Не открывайте файл, пока вы хотите что-то войти. Когда вы не регистрируете материал, вам не нужно добираться до файла и искать конец файла. Это называется Lazy Initialiation. Когда вы хотите что-то зарегистрировать, вы открываете файл
  2. в этом демонстрационном классе. Я использую небольшой трюк, обычно, когда вы закрываете приложение, вы должны закрыть файл журнала (вызов fclose()), но затем вы помните это, а затем, если у вас есть исключение, вы также должны это обработать. Но вы можете использовать register_shutdown_function, и PHP всегда будет вызывать эту функцию в конце скрипта php
  3. посмотреть на PSR-3 (https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) - Группа PHP пытается стандартизировать системы ведения журнала, поэтому нет необходимости писать ваши собственный интерфейс для обработки
  4. это хорошо передать строку даты (метки или DateTime событие объекта лучше пары конструктору. Вы должны пройти зависимость, а не ожидать их
+0

Спасибо за ваши советы! На самом деле это была просто опечатка f ***** где-то в скрипте ... Однако я сделаю так, как вы сказали, относительно класса ведения журнала. – Sciid

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