2011-11-27 33 views
0

我的自制簡單記錄器(只是一個包裝fopenfwritefclose)應當啓用或禁用動態。我想我檢查,如果日誌記錄是啓用的方法是矯枉過正(每次調用一個測井方法需要評估LOGGING):PHP的fwrite爲空?

的config.inc.php

define('LOGGING', true); 

記錄。 PHP

public function __construct($filename) 
{ 
    $this->fp = fopen($filename, 'w+'); 
} 

public function __destruct() 
{ 
    fclose($this->fp); 
} 

public function warn($message) 
{ 
    $this->log('WARN', $message); 
} 

private function log($type, $message) 
{ 
    if(!defined(LOGGING) || !LOGGING) return; 

    fwrite($this->fp, "[$type] $message\n"); 
} 

問題:如何文件處理程序初始化像null並取消檢查LOGGING?我的意思是這樣的:

public function __construct($filename) 
{ 
    // Create a fake stream if logging is disabled 
    $this->fp = !defined(LOGGING) || !LOGGING ? null : fopen($filename, 'w+); 
} 

未來呼叫$logger->warn('Ops..')應該什麼都不做,而不會觸發任何錯誤或通知。

+2

'的/ dev/null' ... :) – BoltClock

+0

這是OS具體點嗎? – gremo

+0

其實,是的,它只針對Unix類操作系統。 – BoltClock

回答

1

我在上面提到過它。但是,現在再次作爲答案,因爲現在我認爲它是一個。

您可以創建一個特殊的記錄器的子類,像

class NullLogger implements Logger { 
    public function log ($message) { /* No operation */ } 
} 

LOGGINGfalse,只要使用此日誌類,並與剛剛無所事事,會出現什麼開銷降低到最低限度每次呼叫。

這種方法有一個連自己的名字/圖案:http://en.wikipedia.org/wiki/Null_Object_pattern

+0

+1我只記得我的自制軟件框架中有一個'Logger_Disabled'子類。另外,對於它的價值,無論Logger是一個接口還是一個類,在多態性方面都沒有關係 - 在我的情況下,它是一個抽象類。 – BoltClock

+0

謝謝,確實是最好的解決方案。 – gremo

0

您可以擴展此類並覆蓋日誌方法(例如,留空體)。然後,如果禁用日誌記錄,則創建子類的對象。

0

文件操作的開銷將會極大地超出做if (LOGGING) { ... }的開銷。你正在優化完全錯誤的東西。檢查LOGGING是否爲真是一個簡單的單值比較。相比之下,即使您正在寫入/ dev/null,文件操作也需要調用文件系統操作,操作系統緩衝區,權限檢查,等等等等。

我不瞭解你,但我會做這個操作,每個成本爲0.01美元,而效果相同但每次成本爲100美元。