2011-01-13 8 views
7

antwortete ich vor kurzem diese Frage:Welche Gründe sprechen neben Singletons für statische Methoden in PHP?

What are good reasons to use static methods in PHP?

Das erste, was in dem Sinne, natürlich zu kommen, ein Singleton war. Mit wenigen Ausnahmen lieferten die anderen Beantworter dasselbe Singleton-Beispiel. Aber das hat mich zum Nachdenken gebracht ... Ich benutze nie wirklich statische Methoden oder Eigenschaften für irgendetwas außer das Erstellen von Singletons!

Eine kurze Suche brachte viele Tutorials zur Verwendung von statischen Methoden, von denen fast alle einige Variationen der gleichen Singleton-Klasse implementieren.

Ich bin wirklich interessiert: Aus welchem ​​Grund müssen wir statische Methoden anders als Erstellen von Singletons machen (oder anders als nur faul sein und eine globale Funktion wollen)?

Hat jemand ein pragmatisches Beispiel für die Verwendung einer statischen Methode, die mit einem dynamischen Entwurfsmuster nicht besser erreicht werden kann? Das Beispiel kann ein Singleton sein, wenn das in seinem Kontext sinnvoll ist, aber ich interessiere mich für andere Gründe neben dem Singleton-Aspekt der Lösung.

Antwort

6

Eine Fabrik Muster wird normalerweise einen statischen Anruf auch bedienen; Es ist jedoch sinnvoll, statische Methoden für jede Klassenmethode zu verwenden, die keine Abhängigkeiten zu den Instanzeigenschaften oder anderen Instanzmethoden aufweist, insbesondere wenn sie aus Leistungsgründen regelmäßig aufgerufen werden. Die logische Position für die folgende Methode in PHPExcel ist in der PHPExcel_Cell-Klasse, da sie sich direkt auf die Manipulation einer Zellenadresse (beliebige Zellenadresse, nicht nur die Adresse einer bestimmten Instanz) bezieht, aber keine Abhängigkeit von der Beispiel, also erkläre ich es als statisch.

public static function stringFromColumnIndex($pColumnIndex = 0) { 
    if ($pColumnIndex < 26) { 
     return chr(65 + $pColumnIndex); 
    } elseif ($pColumnIndex < 702) { 
     return chr(64 + ($pColumnIndex/26)).chr(65 + $pColumnIndex % 26); 
    } 
    return chr(64 + (($pColumnIndex - 26)/676)).chr(65 + ((($pColumnIndex - 26) % 676)/26)).chr(65 + $pColumnIndex % 26); 
} 

Und diese Methode ist nicht besonders schwierig zu testen

+0

Und wie genau verspotten ich den statischen Funktionsaufruf dafür, wenn ich ein anderes Objekt teste, das das verwendet? –

+0

Oh! Ich hatte vergessen, dass es nur eine echte Testmethode gab. –

+0

@Mark James wirft eine gültige Frage auf. Und ich würde sagen, es ist interessant für jeden, der PHPExcel in seinen eigenen Projekten verwenden möchte, um zu wissen, wie es von YouTubern vorgeschlagen wird, es zu testen. – Gordon

3

Es geht nicht unbedingt um Muster. PHP ist keine persistente Umgebung, daher ist die Lebensdauer einer Objektinstanz wahrscheinlich Millisekunden, erfordert jedoch Speicherzuweisung/-freigabe und zusätzliche CPU-Zyklen. Solange Sie keine wiederverwendbaren Objekte oder Sammlungen benötigen, finde ich, dass nicht statische Objekte wenig Berechtigung haben.

+0

würde gerne Ihre Komponententests – Gordon

+0

Leider zu sehen, Sie können nicht, weil ich irgendwie nicht verwenden. Dennoch hat keines der über 50 Client-Systeme, die in den letzten zwei Jahren installiert wurden, irgendwelche Probleme :) –

+2

bist du nicht der Super-Coder! – Stephen

2
+0

+1 und das gleiche gilt für [Singletons] (http://stackoverflow.com/questions/4595964/who-needs-singletons/4596323#4596323). Vermeide beides gleichzeitig. – Gordon

+0

Singletonitis - die Plage von zweifelhaften Designs –

+0

+1 schöne Reihe von Links! Gutes Lesen. – Stephen