PHP:一个相当复杂的消息记录问题

时间:2014-04-27 07:55:44

标签: 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 个答案:

答案 0 :(得分:1)

由于您需要控制器的同步日志记录和模型的延迟日志记录,因此不要那么脏"选项是在记录器中有2个单独的消息队列。

然后你可以将它们分成两个不同的通道,或者将一个定义为主要的,另一个定义为临时的,在控制器记录其消息后刷新后者。