• Statische Methoden imitieren

    von am 14. Oktober 2008

    Ich weiß, ist ein komischer Titel, aber irgendwie ist mir kein besserer Name eingefallen. Heute geht es wieder um Legacy Code. Im täglichen Gebrauch von “altem” Code muss man immer wieder statische Methoden in bereits vorhandenen Klassen implementieren. Da man in PHP 4 noch nicht viel mit statischen Methoden oder Attributen anfangen konnte wurde die meisten Probleme ohne dies gelöst. Was ja auch legitim ist für diese Zeit. Jetzt mit PHP5 und einer besseren aber nicht perfekten Unterstützung des static Schlüsselwortes möchte man aber vielleicht trotzdem der Klasse eine statische Methode hinzufügen. Oft wird es aber dadurch erschwert, dass man in diesem statischen Kontext auf eine Instanzmethode zugreifen muss, da sie damals einfach nicht als statisch definiert wurde. Aus der Erfahrung heraus weiß ich, dass viele dieses Problem lösen, indem sie diese Methode auch als Instanzmethode definieren und somit auf den statischen Kontext verzichten. Auf diese Weise müsste man dann halt jedes mal vor dem Aufruf dieser Methode eine Instanz explizit erstellen. Da man aber eh jedes mal über eine Instanz gehen muss, kann man auch diese Instanz gleich in der Methode selbst erstellen und diese dann doch wieder statisch machen.

    <?php
      class OldClass
      {
        var $className = "OldClass";
    
        public function getClassName( )
        {
          return $this->className( );
        }
      }
    ?>

    Hier hätten wir so einen Fall. Eigentlich müsste das Attribut $className eine Konstante und die Methode getClassName sollte statisch sein. Wenn man jetzt nämlich eine Methode bräuchte, die zum Beispiel den Klassennamen als kleingeschriebenen String bräuchte, so müsste man diese jetzt eigentlich auch als Instanzmethode definieren. Aber wie bereits gesagt halte ich folgenden Ansatz für besser:

    <?php
      class OldClass
      {
        var $className = "OldClass";
    
        public function getClassName( )
        {
          return $this->className( );
        }
    
        public static function getLowerCaseClassName( )
        {
          $class = new self;
          return strtolower( $class->getClassName( ) );
        }
      }
    ?>

    Ich muss dazu sagen, dass dies nur einer von vielen Ansätzen ist, die man gehen kann. Ich denke in vielen Fällen ist dies ein eleganterer als über eine Instanzmethode zu gehen. Es ist aber ganz klar, dass es noch schöner wäre, wenn man ganz ohne diese Tricks auskommt, weil die Klasse bereits die richtigen Kontexte für ihre Methoden bereitstellt. Aber wie es nun mal ist, leben wir nicht in einer perfekten Welt und legacy code wird es immer geben.

    Nils Langner

    Auch wenn Ihr es mir nicht glauben werdet, aber ich habe nichts gegen PHP. Ich rege mich einfach nur gerne auf. Ok so schlimm ist es auch nicht. Eigentlich wollte ich schon immer einen Blog haben und da ...

    Zum Profil von Nils Langner

    Keine Kommentare »

    Noch keine Kommentare

    RSS Feed für Kommentare zu diesem Artikel. TrackBack URL

    Hinterlasse einen Kommentar

    Werbung
    PHP Magazin
    Ausgabe 02/2010

    Dieses Mal mit Artikeln zu den Themen OpenSocial und Apache Shindig, Graphentheorie, Smarty3

    t3n
    Ausgabe 19

    Social Media (R)evolution. Weitere Themen sind noSQL, Crowdsourcing ...

    PHP Journal
    Ausgabe 2/2010

    PHP & Windows optimal nutzen, die besten PHP-CMS im Überblick, Google-API mit Zend Framework nutzen.

    Wir wurden schon öfters gefragt, ob man uns nicht irgendwie unterstützen kann. Die Antwort war immer einfach: Klar! Am einfachsten ist es eure nächsten Einkäufe bei Amazon über unsere Link abzuwickeln. Damit würdet ihr uns schon sehr helfen. Über Co-Autoren freuen wir uns aber noch mehr.