Ankündigung

Einklappen
Keine Ankündigung bisher.

Error-Handler als private Methode?

Einklappen

Neue Werbung 2019

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

  • Error-Handler als private Methode?

    Hallo,
    in einer Klasse habe ich einen eigenen Errorhandler
    PHP-Code:
    public function errorHandler($errcode$errmsg$fileName$line) {


    mit Bezügen auf Propertys der Klasse, den ich bei Bedarf aktivieren kann.
    PHP-Code:
      public function __construct($useInternalErrorHandler false){
        
        if(
    $useInternalErrorHandler) {
          
    set_error_handler(array($this,'errorHandler'));
        }

    Was mich jetzt an der Sache nur stört ist die Tatsache, das der Errorhandler als public definiert werden muss und so nach außen sichtbar ist,
    aber nur intern benötigt wird.
    Gibt es eine einfache Möglichkeit diesen Schönheitsfehler zu beseitigen?
    Randbedingung: Die Lösung sollte bis PHP V5.3 runter kompatibel sein.

  • #2
    Üblicherweise sollte eine Klasse nicht mehr als eine Aufgabe haben, und Fehlerbehandlung ist so eine Aufgabe. Der Error-Handler ist eine Klasse, und warum sollte dessen Methode dann private sein?

    Kommentar


    • #3
      PHP muss sich an seine eigenen Regeln halten
      PHP-Code:
       set_error_handler(array($this,'errorHandler')); 
      Damit gibst du die Kontroller nach "aussen" ab... das $this wird dann zu einer Objektreferenz die behandelt wird, als wäre sie extern erzeugt = kein Zugriff auf private Methoden.

      Ich glaube nicht, das sich das beseitigen lässt.

      Anm.: In C++ gab es "friend" Klassen... damit wäre es vielleicht gegangen
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #4
        als Alternative könnte man höchstens noch versuchen, Errors global in Exceptions umzuwandeln damit man nur noch einen Fehlermechanismus zu beachten braucht.

        Kommentar


        • #5
          Ehrlich gesagt bin ich jetzt auch ein wenig überrascht, aber bei mir funktioniert es auch mit einem private errorHandler:

          PHP-Code:
          <?php
          class Test {
              public function 
          setErrorHandler() {
                  
          set_error_handler(array($this'privateErrorHandler'));
              }

                  
              public function 
          triggerError() {
                  
          trigger_error("User-Error"E_USER_ERROR);
              }
              
              private function 
          privateErrorHandler($errcode$errmsg$fileName$line) {
                  echo 
          "Error-Code: {$errcode}";
              }
          }

          $test = new Test();
          $test->setErrorHandler();
          $test->triggerError();
          VG
          Jack

          P.S.

          eine Alternative wäre auch ein Zugriff mittels Reflection:

          PHP-Code:
              public function setErrorHandler() {
                  
          $reflector = new ReflectionObject($this);
                  
          $method $reflector->getMethod('privateErrorHandler');
                  
          $method->setAccessible(true);
                  
          $that $this;
                  
          set_error_handler(function($errcode$errmsg$fileName$line) use ($method$that) {
                      
          $method->invoke($that$errcode$errmsg$fileName$line);
                  });
              } 
          und ab PHP 5.4 noch eine weitere/einfachere Möglichkeit des Zugriffs auf private Methoden/Eigenschaften mittels Closures

          PHP-Code:
          class Test {
              public function 
          setErrorHandler() {
                  
          $cl = function($errcode$errmsg$fileName$line) {
                      
          $this->privateErrorHandler($errcode$errmsg$fileName$line);
                  };
                  
                  
          set_error_handler($cl);
              }

                  
              public function 
          triggerError() {
                  
          trigger_error("User-Error"E_USER_ERROR);
              }
              
              private function 
          privateErrorHandler($errcode$errmsg$fileName$line) {
                  echo 
          "Error-Code: {$errcode}";
              }
          }

          $test = new Test();
          $test->setErrorHandler();
          $test->triggerError(); 
          -

          Kommentar


          • #6
            Zitat von jack88 Beitrag anzeigen
            Ehrlich gesagt bin ich jetzt auch ein wenig überrascht
            Ich auch, das hätte ich nicht erwartet. Hatte das so in Erinnerung, wie es lstegelitz beschrieben hat.
            Unter PHP V5.3.x kommt da noch
            Code:
            Warning: Invalid callback Test::privateErrorHandler, cannot access private method Test::privateErrorHandler()...
            Funktioniert unter 5.3.x aber trotzdem. Hab da nur die Warnung gesehen und gar nicht mehr das Resultat betrachtet.
            Unter V5.4.x kommt dann auch keine Warnung mehr. Die Reflection-Variante ist schon gespeichert..

            hellbringer : Unabhängig von der positiven Überraschung werde ich nochmal darüber nachdenken, ob die Klasse insgesamt nicht zu überladen ist.

            Dank an alle + eine schönes WE

            Kommentar


            • #7
              Ohne jetzt zu wissen was deine Klasse macht: Es gibt Exceptions, was für PHP-Fehler musst du denn hier auffangen? Klingt antik. Ansonsten warum baust du keine Klasse, die Fehler immer fängt, aber eben erst auf Anfrage preisgibt?

              PHP-Code:
              <?php
              $badShit 
              = new BadShit();
              $badShit();

              if (
              $badShit->hasError()) {
                throw new 
              Exception($badShit->getError(), $badShit->getErrorCode());
              }
              Kommt mir anders jedenfalls kaputt vor.

              Gruß,
              Chriz
              "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

              Kommentar


              • #8
                naja, manche PHP-Funktion erzeugen Errors wenn z.B. das Input-Format nicht stimmt oder sonst was unerwartetes passiert.

                Kommentar


                • #9
                  Zitat von jack88 Beitrag anzeigen
                  ...

                  und ab PHP 5.4 noch eine weitere/einfachere Möglichkeit des Zugriffs auf private Methoden/Eigenschaften mittels Closures
                  ...
                  Closures gibt es doch seit 5.3. Mit 5.4 kamen Traits.

                  Kommentar


                  • #10
                    Die Klasse ist der Kern für eine kleine Testumgebung. Die Idee war, Warnungen und Notices als Info mit im Testergebnis zu vermerken.
                    Die Warnung kommt aus der Umgebung, nicht aus der Klasse. So wie hier im Beispiel shmop_open "n" in der letzten Zeile generiert die PHP-Funktion shmop_open eine Warnung.

                    phpcheck.shmop.png

                    Die Info allein bringt jedoch nicht viel. Ich bin deshalb noch am überlegen, ob ich das so lasse oder lieber die ganze Meldung geeignet anzeige.
                    Aber das ist ein anderes Thema.

                    Kommentar


                    • #11
                      Zitat von jack88 Beitrag anzeigen
                      ...

                      und ab PHP 5.4 noch eine weitere/einfachere Möglichkeit des Zugriffs auf private Methoden/Eigenschaften mittels Closures
                      ...




                      @SirSnyder Closures gibt es doch seit 5.3. Mit 5.4 kamen Traits.
                      Bei PHP 5.3 gab es noch keinen $this support für Closures.
                      Mein Closure-Code-Beispiel wird mit PHP 5.3 also nicht funktionieren.

                      Und selbst wenn Du das $this an das Closure explizit übergibst, wird der Zugriff auf eine private Methode innerhalb des Closures (Version < PHP 5.4) fehlschlagen.

                      PHP-Code:
                      // Das würde mit PHP5.3 fehlschlagen

                          
                      public function setErrorHandler() {
                              
                      $that $this;
                              
                      $cl = function($errcode$errmsg$fileName$line) use ($that) {
                                  
                      $that->privateErrorHandler($errcode$errmsg$fileName$line);
                              };
                              
                              
                      set_error_handler($cl);
                          } 

                      VG
                      Jack
                      -

                      Kommentar


                      • #12
                        Zitat von Dormilich Beitrag anzeigen
                        naja, manche PHP-Funktion erzeugen Errors wenn z.B. das Input-Format nicht stimmt oder sonst was unerwartetes passiert.
                        Kann schon sein, aber mir ist länger keine mehr untergekommen, deshalb wundert mich das Vorgehen halt ein bißchen.
                        "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

                        Kommentar


                        • #13
                          Pack doch einfach den Error-Handling Code in die Closure, statt aus der Closure die private Methode aufzurufen

                          Kommentar


                          • #14
                            Was spricht gegen eine eigene ErrorHandler-Klasse ? https://eval.in/private/f78dae6265deff
                            [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                            Kommentar

                            Lädt...
                            X