2009-11-19 4 views
5

Was ist der beste Weg, um mit "Dienstprogramm" -Funktionen in einem OOP PHP-Framework umzugehen? Im Moment haben wir nur eine Datei mit mehreren Funktionen, die im gesamten System benötigt werden. (Zum Beispiel eine distribute()-Funktion, die einen Wert und ein Array akzeptiert und ein Array mit dem Wert in den gleichen Proportionen und den gleichen Schlüsseln wie das Eingabe-Array liefert.)Utilities-Datei in PHP?

Ich habe mich immer "schmutzig" gefühlt, weil es ist überhaupt nicht objektorientiert. Ist es besser, diese als statische Methoden in verschiedene Klassen zu verschieben, oder ist das nur ein semantischer Workaround? Oder wird es nur eine Ebene in einem Rahmen geben, in dem einige Dinge aus der OOP-Struktur herausfallen werden?

Antwort

3

Ich war schon immer pragmatischer bei Fragen wie diesen.

Wenn Sie Voll-OOP gehen wollen, sollten Sie diese natürlich in Klassen stecken. Diese Klassen werden jedoch nur Containerklassen sein, da sie keine Objekte darstellen.

Außerdem: Wenn Sie Klassen verwenden, müssen Sie entweder eine Instanz dieser Klasse verwenden, das Singleton-Muster verwenden oder jede Funktion als statisch deklarieren. Der erste ist langsamer (okay, vielleicht nicht so viel, aber in einem großen Rahmen werden solche Dinge auch groß - vor allem in interpretierten Sprachen wie PHP), während die zweite und dritte einfach nutzlos und einfach ein OOP-Wrapper sind für eine Reihe von Funktionen (insbesondere der dritte Ansatz).

EDIT: Fühlen Sie sich frei, mich falsch zu beweisen. Ich könnte. Ich bin nicht so erfahren und habe es immer so gesehen, aber ich könnte falsch liegen.

+0

+1 gute Antwort. –

+1

abgeordnet. Es hat keinen Sinn, alles in Objekte zu verwandeln, nur um 100% OOP zu haben. –

+1

Der Vorteil, Funktionen in einen OOP-Wrapper zu pushen und sie als statisch zu deklarieren, liegt darin, dass beim Aufruf der Funktionen explizit den Code-Lesern klar wird, wo die Funktionen definiert sind. Ich benutze diese Technik, um Namespaces zu simulieren. – jkndrkn

2

Ich denke immer an Utility-Funktionen als Erweiterungen der Standard-PHP-Funktionen. Sie sind nicht objektorientiert, weil Sie keinen wirklichen Nutzen davon haben, sie zu OO zu machen.

5

Ich neige dazu, eine Util() Klasse zu erstellen, die nur statische Methoden enthält, keine Attribute hat und nicht vererbt wird. Im Wesentlichen fungiert es als ein "Namespace" für eine Reihe von Utility-Funktionen. Ich werde zulassen, dass diese Klasse an Größe zunimmt, wird aber gelegentlich Methoden in eigene Klassen aufteilen, wenn klar ist, dass diese Methoden nur für die Arbeit mit bestimmten Arten von Daten entwickelt wurden oder wenn es klar ist, dass eine Gruppe verwandter Methoden verwendet werden sollte gruppiert in eine Klasse zusammen mit vielleicht einigen Attributen.

Ich denke, es ist vollkommen in Ordnung, von reinen OOP-Praktiken abzuweichen, solange der abweichende Code gut organisiert ist und keine architektonischen Mängel in Ihrem System verursacht, die das Verständnis und die Wartung erschweren.

+0

Ich stimme dem ersten Teil nicht zu - besonders mit der Util-Klasse. Lies einfach meine Antwort, um zu sehen, warum. Aber was Sie danach geschrieben haben, brachte mich zum Nachdenken. Wenn diese Untermengen nicht nur eine Sammlung von statischen Funktionen und nichts anderes sind, sondern zum Beispiel einige kombinierte Eigenschaften haben (schlechtes Beispiel, aber das einzige, was einem einfällt: Helfer in einer Klasse anzeigen, wobei die Ansicht ein Klassenmitglied ist) Ich hoffe du bekommst den Punkt). +1 – Franz

+0

Darn, ich habe mein Stimmlimit vergessen. Es tut uns leid. Vier weitere Stunden;) – Franz

+0

Nun kann ich tatsächlich die Verwendung einer generischen Util-Klasse sehen, um alle Arten von kleinen handlichen Funktionen zu halten, hält sie sauber, dicht zusammen und unter einem gemeinsamen "Namespace" nämlich das Objekt. In der Tat müssen Sie sie statisch definieren, aber hey, was ist daran falsch? – ChrisR