dedlfix: Verwendung des Konstruktors und Destruktors

Beitrag lesen

echo $begrüßung;

Ich lese hier immer wieder das jmd den Konstruktor oder Destruktor missbraucht.

Das war mal ein einzelner Thread. :-) Und jetzt kommt noch ein zweiter hinzu.

Ich würde dem Konstruktor des Front-Controllers sagen er soll die Settings laden die nötig sind und danach den Dispatcher aufrufen usw..
Als Resultat käme ein View zurück welches dann $this->view zugewiesen wird.

Ein Konstruktor gibt nichts zurück. Er wird beim Instantiieren eines Objekts aufgerufen, um Initialisierungsarbeit zu leisten. Alles darüber Hinausgehende stellt in meinen Augen einen Missbrauch dar. Beim Instantiieren eines Objekts entsteht dieses und wird vom Instantiierungsoperator new zurückgegeben. Wenn du kein Objekt benötigst, weil du glaubst, alles in einem Schritt erledigen zu können, dann kannst du gleich eine Funktion nehmen. Meinetwegen auch eine statische Methode einer Klasse, die sonst keine weiteren Mitglieder hat (außer vielleicht weiteren statischen Mitgliedern, um Zugriffsbeschränkungen zu implementieren oder eine Art Namensraum zu schaffen).

Du solltest dich immer fragen: Was gibt es sonst noch für Möglichkeiten, etwas zu implementieren? (Deren Beantwortung setzt natürlich das Wissen um die Alternativen voraus.) Und mit welcher Begründung verwende ich gerade diese und nicht jene Möglichkeit. (Auch hier kann die Erfahrung helfen, den Antwortprozess zu beschleunigen.)

Aber ihr würdet das nicht so machen und ich verstehe nicht ganz warum,
warum noch eine extra Methode schreiben z.B. namens "run()" und er soll alles machen und im Konstruktor soll dann nur $this->run(); stehen.

Es könnte sich später herausstellen, dass noch mehr Funktionalität zwischen der Instantiierung und dem run() benötigt wird. Schau dir mal den FrontController vom Zend Framwork an. In seiner einfachsten Anwendung ruft man run() als statische Methode auf und kommt auch nicht mit einer Instanz in Berührung. Hat man individuellere Ansprüche als das run() zu erfüllen vermag, kann man sich eine Instanz erstellen, von ihr eine oder mehrere der öffentlichen Methoden verwenden und anschließend mit dispatch() den Hauptprozess starten. Auch run() ist keine Inkarnation einer eierlegende Wollmilchsau sondern holt sich eine Instanz, setzt das ActionController-Verzeichnis und startet dann dispatch().

Ich meine, wenn es wirklich so geht das der Konstruktor das erledigen kann, warum nicht?

Es geht auch, ein PHP-Script ohne OOP und auch ohne Funktionen zu schreiben. Der Grund, warum man dies (als Nicht-mehr-Anfänger) außer für sehr einfache Dinge nicht macht, ist die Übersichtlichkeit und Wartbarkeit, die man mit der Strukturierung durch Funktionen und auch OOP bekommen kann. Eine kleine klar abgegrenzte Aufgabe lässt sich einfacher verstehen als sich in einem großen Alles-drin-Code-Haufen zurecht zu finden. Natürlich kann man auch einen großen Code-Haufen mit Kommentaren, Einrückungen und Leerzeilen recht ordentlich gliedern. Allerdings ist man durch die Nicht-Separierung darauf angewiesen, den ganzen Code auf einmal im Auge zu behalten, wenn man Änderungen vornimmt. Bei kleinen abgegrenzten Einheiten mit wenigen Schnittstellen nach außen sind die Auswirkungen von Änderungen geringer und schneller überschaubarer.

Und warum ne extra Methode für die Ausgabe schreiben wenn das der Destruktor am Ende machen kann?

Warum willst du diese Aufgabe in den Destruktor einbetten? (Gemäß deiner Philosophie kann das doch auch gleich der Konstruktor mit erledigen.) Der Destruktor räumt auf. Üblicherweise wird das irgendwann angestoßen, wenn grad nichts zu tun ist, was meist nach Büroschluss ist. Das Arbeitsergebnis will der Chef aber gern noch vor seinem Feierabend sehen und nicht erst, wenn die Putzfrau zufälligerweise vorbeikommt. Bei PHP hast du noch Glück, dass es als Web-Sprache anders arbeitet als die in einer Desktop-Umgebung üblicherweise eingesetzten OOP-Systeme. Der Destruktor wird noch innerhalb des Requests aufgerufen. Doch auch hier hast du schon einige Nachteile, wie beispielsweise den, dass die HTTP-Header schon gesendet wurden. Wenn deine View da noch mitmischen will, ist es zu spät.

echo "$verabschiedung $name";