PHP – Verwendung und Probleme statischer Methoden

Statische Methoden sind zwar ein Teil einer Klasse und werden daher als Teil der objektorientierten Programmierung verstanden. Falsch eingesetzt sind sie aber nichts anderes als eigenständige Funktionen und daher prozeduraler Programmierstil.

Dieser Beitrag beschäftigt sich mit der Differenzierung dieser Problematik und ihr erfahrt, was tatsächliche Einsatzgebiete einer statischen Methode sind.


Was sind statische Methoden?

Sie werden in einer Klasse definiert und mit dem Schlüsselwort static ausgezeichnet.

Sie können genau wie „normale“ Methoden alle drei Sichtbarkeiten (public, protected, private) verwenden. Aufgerufen werden statische Methoden ohne eine Instanz der Klasse zu erzeugen und daher nicht mit einen -> sondern mit ::

Fun Fact: Der Name für den doppelten Doppelpunkt ist T_PAAMAYIM_NEKUDOTAYIM. Falls ihr dieses Token also im Errorlog seht, wisst ihr jetzt was es meint.


Ist das jetzt objektorientiert?

Nein! Das ist prozedurale Programmierung.

Damit erreichen wir genau das selbe. Und wenn es um die Strukturierung ähnlicher Funktionen geht, dann ist ein Namensraum die viel bessere Wahl.


Wann verwende ich statische Methoden?

Statische Methoden sind zum Beispiel dann sinnvoll, wenn bei der Erstellung von Objekten „geholfen“ werden soll. Bei vielen MVC, die dem Active Record Pattern folgen, werden die Models mit einer statischen find() Methode aus der Datenbank geladen.

Der Anwender müsste andernfalls den Datensatz selbst aus der Datenbank laden und dann über new User() ein Objekt erzeugen. Das würde sehr schnell zu dupliziertem Code führen und wäre nicht sehr sinnvoll.

Ein weiterer Anwendungsfall wäre ein Singleton.


Zugriff innerhalb der Klasse

Innerhalb der selben Klasse werden statische Methoden auf zwei Arten angesprochen: Entweder mit dem Schlüsselwort static oder mit self.

Außer ihr wollt explizit verhindern, dass eine Kindklasse die Methode überscheibt, solltet ihr also static verwenden.


Probleme beim Unit-Testing

Da bei der Verwendung statischer Methoden, der Klassenname explizit hingeschrieben werden muss, kann ein Test diesen nicht durch ein Mock-Objekt ersetzen. Oft werden an dieser Stelle die Tests dann sehr aufwendig.


Fazit

Statische Methoden sind zwar ein Teil der objektorientierten Programmierung und haben durchaus ihre Berechtigung, dennoch solltet ihr euch jedes Mal gut überlegen, ob ihr das Problem nicht anders besser lösen könnt.


Was dich noch interessieren könnte:

Ein Gedanke zu „PHP – Verwendung und Probleme statischer Methoden“

  1. Schöne, kompakte Darstellung von static.

    Aber auch wenn mit ’static‘ definierte Methoden nicht die schönste Art der OOP sind: Ich sehe aber nicht, dass sie ähnlich beschränkt wären wie klassische Funktionen. Schließlich hätte eine Klasse/ Objekt bei einer entsprechend einfachen Umsetzung auch nicht mehr Funktionalität als eine Funktion.

    Ein wichtiger Unterschied ist, dass auch bei einer statischen Methode ein Zugriff auf die Attribute der Klasse möglich ist – und deren Lebensdauer geht über den Aufruf der Methode hinaus. Die Datenhaltung arbeitet also gänzlich anders als bei Funktionen. Lediglich das instantiierte Objekt fehlt bei statischen Methoden. Und Instantiierung ist für sich genommen nicht einmal ein zwingendes Merkmal der OOP.

    Viele Grüße
    Stephan

Kommentare sind geschlossen.