2014-04-27 39 views
-1

我有這段代碼PHP:一個相當複雜的消息記錄問題

class Logger{ 
    public static $messages = array(); 
    public static function log($msg){ 
     if(!empty($msg)) 
      self::$messages[] = $msg; 
    } 
} 

class Model{ 
    function foo(){ 
     if(rand(1,5)>3) // This will only occasionally be true 
      Logger::log('bar2'); 
     return 'bar1'; 
    } 
} 

class Controller{ 
    public function foo(){ 
     $m = new Model(); 
     Logger::log($m->foo()); 
    } 
} 

$c = new Controller(); 
$c->foo(); 
print_r(Logger::$messages); 

結果是

Array 
(
    [0] => bar2 
    [1] => bar1 
) 

我需要它是第一BAR1然後BAR2,但它不是那樣簡單它似乎。因爲我可能並不總是有bar2,所以我可能會在我顯示的特定部分之前和之後記錄其他消息,因此排序並不是真正的選擇。其他東西我不能是切換在控制器或模型中調用的函數的順序,因爲控制器使用模型返回的數據並記錄它。另外,我不能在控制器中移動bar2的日誌記錄,因爲有多個控制器(可能還有更多未來的控制器)將調用此模型。我所能做的就是操縱記錄器類代碼,但我無法想出一個乾淨的方式來切換這兩個消息的位置。

+1

[我會讀這個答案](http://stackoverflow.com/a/18682856) – HamZa

+0

@HamZa叫我笨,但我似乎無法建立連接:/ –

+0

嗯,我沒有看到任何東西複雜在這裏:由於您正在使用的記錄器沒有滿足日誌記錄的要求,很明顯,您一直在選擇錯誤的記錄器。拋出並使用滿足您要求的組件。或者你的問題到底是什麼? – hakre

回答

1

由於您需要控制器的同步日誌記錄和模型的延遲日誌記錄,「不是那麼髒」選項應該是在記錄器中有兩個單獨的消息隊列。

然後,您可以將它們分開爲兩個不同的通道,或者將一個定義爲主要,另一個定義爲臨時,在控制器記錄其消息後將其刷新。