2014-01-16 37 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. 沒有打開的文件。當你不記錄東西時,你不需要到達文件並尋找文件結尾。它被稱爲延遲初始化。當你想記錄一些他們打開文件
  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

感謝您的建議!其實這只是一個錯誤的錯字在腳本的某處... 但是我會按照你所說的有關伐木班的方式去做。 – Sciid