Ankündigung

Einklappen
Keine Ankündigung bisher.

Debugger mit Hilfe des Singleton Pattern

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Debugger mit Hilfe des Singleton Pattern

    Hallo Leute,
    Ich versuchte zurzeit einen Debugger mit den Singleton Pattern zu entwickeln.
    Der echoDebugger (Gibt die Nachrichten direkt im Browser aus) funktioniert.

    Nun habe ich auch einen 2. Debugger entworfen, der alles in einer Log Datei loggen soll, aber hier tauchen die Probleme auf.

    Hier die Beiden Debugger:

    PHP-Code:
        // Interface for Log and echo Debugger
        
        
    interface Debugger {
            public static function 
    getInstance();
            public function 
    debug($prefix$msg);
        }


        
    // Set Normal Log File
        
    define("FILE""logger.log");
        
        class 
    echoDebugger implements Debugger{
            protected 
    $prefix;
            protected 
    $msg;
            protected 
    $time;
            
            protected function 
    __construct() {}
            
            private static 
    $instance null;
            
            public static function 
    getInstance() {
                if(
    self::$instance == null){
                    
    self::$instance = new echoDebugger();
                }
                return 
    self::$instance;
            }
            public function 
    debug($prefix$msg){
                
    $this->prefix $prefix;
                
    $this->msg $msg;
                
    $this->time date("d:m:Y H:i");
                
                echo 
    "[{$this->prefix}]" "[{$this->time}]" {$this->msg}";
            }
        }

        class 
    logDebugger{
            protected 
    $prefix;
            protected 
    $msg
            protected 
    $time;
            protected static 
    $instances = array();
            protected 
    $logfile;
            
                protected function 
    __construct() {}
            
            public static function 
    getInstance($logfile) {
                if(!isset(
    self::$instances[$logfile])){
                    
    self::$instances[$logfile];
                }
                return 
    self::$instances[$logfile];
            }
            
            public function 
    debug($prefix$msg) {
                
    $this->time date("d:m:Y H:i");
                
    $this->msg $msg;
                
    $this->prefix $prefix;
                
                
    error_log("[{$this->prefix}]" "[{$this->time}]" {$this->msg}\n"3self::$instances[$logfile]);
            }
        } 
    Folgender maßen ruft man den Debugger auf:
    PHP-Code:
    $logger logDebugger::getInstance("test.log");
    $logger->debug("WARNUNG""test"); 
    Ich erhalte folgende Fehlermeldung:


    Notice: Undefined index: test.log in D:\xampp\htdocs\MW3 Server Interface\classes\Debugger\debugger.class.php on line 57

    Notice: Undefined index: test.log in D:\xampp\htdocs\MW3 Server Interface\classes\Debugger\debugger.class.php on line 59

    Fatal error: Call to a member function debug() on a non-object in D:\xampp\htdocs\MW3 Server Interface\classes\Debugger\debugger.class.php on line 72

    Hoffe ihr könnt mir Helfen,

    mfg

    Sebastian

  • #2
    Hallo Sebastian,

    PHP-Code:
            public static function getInstance($logfile) {
                if(!isset(
    self::$instances[$logfile])){
                    
    self::$instances[$logfile];
                }
                return 
    self::$instances[$logfile];
            } 
    Du hast hier auch lediglich ein Array das du zurückgibst. Du müsstest irgendwas wie

    PHP-Code:
            public static function getInstance($logfile) {
                if(!isset(
    self::$instances[$logfile])){
                    
    self::$instances[$logfile] = new logDebugger();
                }
                return 
    self::$instances[$logfile];
            } 
    Viele Grüße,

    Dirk

    Kommentar


    • #3
      Habe nun das Skript verbessert, aber nun zeigt er an, dass ich keinen Datei Namen übergeben habe.

      Warning: error_log() [function.error-log]: Filename cannot be empty in D:\xampp\htdocs\MW3 Server Interface\classes\Debugger\debugger.class.php on line 67

      Kommentar


      • #4
        Habe es jetzt so versucht:

        PHP-Code:
        error_log("[{$this->prefix}]" "[{$this->time}]" {$this->msg}\n"3self::$instances[$this->logfile]); 
        Aber er sagt immer noch, dass ich keinen Datei Namen übergeben habe... Hoffe du kannst mir helfen

        Kommentar


        • #5
          self::$instances[$this->logfile]
          enthält ja auch das Debugger-Objekt, nicht den Dateinamen. Diesen solltest Du außerdem im Objekt hinterlegen. Offenbar hast Du Dich selbst in Deinem Singleton verheddert

          Wozu benutzt Du überhaupt den Schlüssel? Ich finde das ganze Prinzip total unpraktisch zum Debuggen. Kannst Du Dich nicht auf ein Logfile beschränken. Den ganzen Singleton-Käse könnte man IMHO zugunsten eines unkomplizierten Debuggens besser als statische Methoden umsetzen.

          Kommentar


          • #6
            Hm, bin ja selber nicht gerade der OOP-Oberguru. Allerdings kommt es mir doch ein wenig komisch vor, welchen Aufwand Du betreibst, um letztlich manuel ein echo oder error_log abzusetzen. Interface, Singelton, zwei separate Klassen.

            Ist das hier eher eine Übung, um OOP-Prinzipien zu verinnerlichen oder geht es Dir echt ums Debuggen? Ich meine, wenn ja könntest Du Dich doch auf eine Klasse beschränken, die nach einem global per Konstante definierten Modus - echo für die Produktionsphase, log für die Livephase - entweder das eine oder andere tut.

            Kommentar


            • #7
              Machs doch statisch?

              Debug::stop(), Debug::write() und Debug::log() heissen die Dinger bei mir. Ich verschieb mal ganz ungeniert (undefined index )

              Hier mal die Klasse von mir, mittlerweile etwas verschlankt:
              http://www.php.de/tutorials/42702-debugging.html

              Kommentar


              • #8
                Die Debugger sind derzeit nicht simpel austauschbar, oder? Also, ich kann nicht den echoDebugger einfach so durch den logDebugger ersetzen, weil ich überall im Code den Klassennamen angeben muss, um an die Instanz zu kommen. Ist das beabsichtigt?

                Kommentar


                • #9
                  Wie ich das verstehe will er sogar noch mehrere LogDebugger verwenden. Entgegen dem ST-Ansatz.

                  Kommentar


                  • #10
                    Vielleicht eine allgemeine Debugger-Klasse, die in der Anwendung angesprochen wird und in die sich konkrete Debugger per Listener-/Observer-Pattern reinhängen können, um verschiedene Arten der Ausgabe zu generieren.

                    - http://de.wikipedia.org/wiki/Observe...wurfsmuster%29

                    Umriss:

                    PHP-Code:
                    <?php

                    interface IDebuggerListener
                    {
                        public function 
                    setDebugger(Debugger $debugger);
                        public function 
                    update();
                    }

                    abstract class 
                    DebuggerListener implements IDebuggerListener
                    {
                        protected 
                    $debugger;

                        public function 
                    setDebugger(Debugger $debugger)
                        {
                            
                    $this->debugger $debugger;
                        }
                    }

                    class 
                    EchoDebuggerListener extends DebuggerListener
                    {
                        public function 
                    update()
                        {
                            
                    printf("%s\n"$this->debugger->getMessage());
                        }
                    }

                    class 
                    CrazyDebuggerListener extends DebuggerListener
                    {
                        public function 
                    update()
                        {
                            
                    printf("%s\n"str_rot13($this->debugger->getMessage()));
                        }
                    }

                    class 
                    Debugger
                    {
                        protected 
                    $listeners;
                        protected 
                    $message;

                        public function 
                    addListener(IDebuggerListener $listener)
                        {
                            
                    $this->listeners[] = $listener;
                            
                    $listener->setDebugger($this);
                        }

                        protected function 
                    broadcast()
                        {
                            foreach (
                    $this->listeners as $listener) {
                                
                    $listener->update();
                            }
                        }

                        public function 
                    getMessage()
                        {
                            return 
                    $this->message;
                        }

                        public function 
                    debug($message)
                        {
                            
                    $this->message $message;
                            
                    $this->broadcast();
                        }
                    }



                    $debugger = new Debugger();

                    $debugger->addListener(new EchoDebuggerListener());
                    $debugger->addListener(new CrazyDebuggerListener());

                    $debugger->debug('Hello World!');

                    Kommentar


                    • #11
                      Ich halte das Konzept für sehr fragwürdig. Einen Debugger erwarte ich in einer VM oder einer umgebenden Schicht, nicht in der Applikation direkt. Der Anwendungsfall ist IMHO mit xdebug und einem vernünftig implementierten Logger sauber abzubilden.

                      Kommentar


                      • #12
                        Ein Debugger ist kein Logger, Logs sind Statusse über bestimmte Vorgänge, Debugging ist weit aus mehr als simples Loggen von diesen Statussen, derweil ein Sauberer Debugger auch immer den aktuellen Scope analysiert, was in vielen Situationen recht Komplex und auch nur über die Reflection-Class gelöst werden kann.

                        Wenn du simples Logging betreiben willst, benutz halt ein Deliver-Maintainer-Listener Konstrukt, will meinen: Observer Pattern, sauber objektorientiert abgebildet, erzeugst du ein Logger bei dem es absolut egal ist was geloggt werden soll noch wie es geloggt werden soll.

                        Kommentar


                        • #13
                          OT

                          ... Stati ... *scnr*

                          /OT

                          Kommentar


                          • #14
                            Zitat von hausl Beitrag anzeigen
                            OT

                            ... Stati ... *scnr*

                            /OT
                            http://faql.de/numerus.html#status

                            Kommentar


                            • #15
                              Ha! Wie geil ist das denn.. danke für die Erleuchtung.. das hab ich so echt noch nie wo gehört /gelesen.. und der Jüngste bin nich ja auch grad nicht mehr. Wobei ich Statusse ned so schlimm find.. Schräg klingt "Statussen"
                              Noja seis drumm. danke und sorry für die Thread-Verschmutzung.

                              LG

                              Kommentar

                              Lädt...
                              X