Observer

来源:互联网 发布:lua for windows 64 编辑:程序博客网 时间:2024/05/29 03:37
<?php


//The Observer is a collaboration between an Observable class (the subject) and one or more
//Observer classes (the clients). The Observable class allows Observers to register with it. Then, whenever
//the state of the Observable object changes, all registered Observers are notified
abstract class Observer {


    abstract function update($error_handler);
}


class FileErrorLogger extends Observer {


    function __construct() {
    
    }


    function write($msg) {
        $fh = fopen('./Log/' . date('Y-m-d') . '.txt', 'a');
        fwrite($fh, date('Y-m-d H:i:s: ') . $msg . PHP_EOL);
        fclose($fh);
    }


    function update($error_handler) {
        $error = $error_handler->getState();
        $this->write($error['msg']);
    }
}


class EmailErrorLogger extends Observer {
    private $_addr;
    private $_subject;


    function __construct($addr, $subject = 'Application Error Message') {
        $this->_addr = $addr;
        $this->_subject = $subject;
    }


    function mail($msg) {
        //        mail($this->_addr, $this->_subject, date('Y-m-d H:i:s :') . $msg);
        echo "send mail $msg";
    }


    function update($error_handler) {
        $error = $error_handler->getState();
        $this->mail($error['msg']);
    }
}






class SyslogErrorLogger extends Observer  {


    function SyslogErrorLogger($msg) {
        define_syslog_variables();
        openlog($msg, LOG_ODELAY, LOG_USER);
    }


    function log($msg) {
        syslog(LOG_WARNING, $msg);
    }


    function update($error_handler) {
        $error = $error_handler->getState();
        $this->log($error[msg]);
    }
}


class ErrorHandler {
    private $_observers = array();
    public $_error_info;


    function attach(&$observer) {
        $this->_observers[] = $observer;
    }


    function detach($observer) {
        foreach ($this->_observers as $key => $value) {
            if ($value === $observer) {
                unset($this->_observers[$key]);
                return;
            }
        }
    }


    function notify() {
        foreach ($this->_observers as $key => $value) {
            $observer = $value;
            $observer->update($this);
        }
    }


    function getState() {
        return $this->_error_info;
    }


    function setState($info) {
        $this->_error_info = $info;
        $this->notify();
    }
}


$f = new FileErrorLogger();
$e = new EmailErrorLogger('root@sina.com');
$log = new ErrorHandler();
$log->attach($f);
$log->attach($e);
$log->setState(array('msg' => 'error occurred ' . date('Y-m-d')));


var_dump($log);
$log->detach($f);
$log->detach($e);
var_dump($log);
var_dump($f, $e);