2012-08-14 14 views
5

Ich möchte die Meinung der Menschen über die Verwendung von statischen Klassen anstelle von Namespaces messen. Ich komme aus einem C++ - Hintergrund und bin ziemlich begeistert von seiner Syntax und wie Sie Code strukturieren können. Ich entschied kürzlich, dass ich meinen Code in logische Einheiten statt nur Dateien gruppieren musste. Zum Beispiel bevorzuge ich Anrufe wie User :: Login zu user_login. Also habe ich ein wenig gegoogelt und war erleichtert festzustellen, dass PHP Namespaces hat. Meine Erleichterung dauerte nicht lange, ich mag die Syntax wirklich nicht; es fügt meinen Funktionsaufrufen mehr Chaos hinzu. Im Moment verwende ich statische Klassen, um Namespaces zu simulieren. Gibt es da Nachteile?PHP Static Class oder Namespace

Ich fand eine ähnliche Frage bei PHP Namespaces vs Classes with static functions, aber es gab nicht viel Diskussion.

Auch ist es eine Möglichkeit, die folgende Situation zu vermeiden:

class Test { 
public static void myFunc() { 
    Test::myOtherFunc(); 
} 
public static void myOtherFunc() { 

} 
} 

ich es ok wäre davon ausgegangen, Funktionen in der gleichen Klasse zu nennen, ohne Angabe des Namens, aber anscheinend nicht. Gibt es dafür Workarounds (zB in C++ das using-Schlüsselwort)?

+0

'self ::' und '$ this->' werden in PHP verwendet, um eigene statische bzw. Instanzmethoden aufzurufen. –

+0

Also gibt es keine Möglichkeit für die Qualifikation implizit zu sein? Dh um die aktuelle Klasse für eine Funktion zu überprüfen? – user1520427

+1

Nein, aber ich finde explizit eine gute Sache :) –

Antwort

5

Einstimmend tatsächlich wurde in die exakte entgegengesetzte Richtung bewegt Ich habe:

  1. Verwenden von Namespaces Domain-Klassen (oder Funktionen)
  2. Verwendung Dependency Injection, wo ich sonst statische Klassen verwendet haben
zu organisieren

Die Sache mit statischen Klassen, Namespaces zu simulieren ist, dass Sie sie nicht über mehrere Dateien hinweg organisieren können, alles muss in einer Datei definiert werden; das kann durchaus dem persönlichen Geschmack entsprechen.

Die andere Sache über statische Klassen ist, dass Sie ohne jeden Zustand starten und langsam einige Zustandsverwaltung kriecht und Sie mit einer seltsamen Lock-in-Abhängigkeit enden. Der Status sollte für Instanzen reserviert sein. Derzeit ist meine einzige bemerkenswerte statische Klasse die siteweite Konfiguration.

Schließlich ist die Selbstreferenzierung in statischen Klassen explizit, während sie in Namespaces genau wie C++ funktioniert: Sie geben den Funktionsnamen an und suchen zuerst im Namespace nach.

+0

Ich mag die Idee von Namespaces und wie sie Sie Code verwalten lassen, wie Sie sagten, Sie können sie über mehrere Dateien hinweg organisieren. Meine einzige wirkliche Beschwerde ist die klobige Syntax. Ich sehe nicht die Notwendigkeit, \ und die Konsistenz mit anderen Sprachen zu entfernen. – user1520427

+0

@ user1520427 Ich weiß, wie Sie sich fühlen, es ist kein toller Hingucker, aber denken Sie an es als eine Verzeichnisstruktur Sache und es macht Sinn :) der Standard-Auto-Lader verwendet es tatsächlich auch so. –

4

Wenn Sie vom Standpunkt der Code-Struktur betrachten, gibt es keinen Unterschied zwischen der statischen Klassenmethode und der Namespace-Funktion. Beide enden auf globaler Ebene. Der einzige Unterschied besteht darin, dass Sie mit der statischen Klassenmethode versuchen, OOP zu fälschen.

Daher ist es besser, Namespace-Funktionen zu verwenden, wenn das, was Sie wirklich brauchen, eigenständige Funktionen sind. Namespaces dienen zum Gruppieren von Dingen (sowohl Funktionen als auch Klassen).

Für Sie User::login() Beispiel wäre es eine schlechte Praxis. Stattdessen sollten Sie ein reales Objekt haben, das in der Lage ist, den Zustand zu halten.

$mapper = new UserMapper; 
$user = new User; 
$user->setNickname($name); 

$mapper->fetch($user); 

if ($user->hasPassword($password)) 
{ 
    $user->setLastLogin(time()); 
} 
else 
{ 
    // log the access attempt 
    // set error state 
} 

$mapper->save($user); 

Unterm Strich ist dies: Wenn Sie statische Strukturen (Funktionen oder Methoden) verwenden, es nicht OOP ist. Du täuschst es nur vor. Stattdessen sollten Sie echte OOP verwenden, mit dependency injection.

Wenn Ihr Code statische Methoden und Variablen überall verwendet, führt dies zu einer engen Kopplung zwischen Klassen, fügt global state hinzu und macht harder to maintain and test Ihre Codebasis. Und das ist nicht PHP-spezifisch.