Klassen nebeneinander benutzten
Pilstrinker
- php
Hallo Forum,
PHP kann doch auch OOP. das habe ich inzwischen auch ausprobiert.
Vererbung geht schon und Prototyping habe ich auch mit rumgespielt.
Ich hoffe, dass nennt sich überhaupt so, also wenn man in einer Muster-Klasse nur die Signaturen von den Methoden hinschreibt und die dann in der eigentlichen Klassendefinition definiert werden müssen.
Ein Verständnisproblem habe ich aber im Moment:
Wenn ich jetzt mehrere Klassen nebeneinander definiere, die alle Bestandteil meines Hauptprogrammes sind, wie kann dann die eine Klasse auf die Erkenntnisse (Eigenschaften) oder Methoden der anderen zugreifen? Muss ich das Objekt der ersten Klasse bei der Instatiierung der zweiten irgendwie übergeben? Oder kann ich mir auch so eine Art Klassen-Speicher bauen, in dem jede Schwesterklasse nachschauen kann, ob die andere Schwester schon aktiv war und dann dort die Objektreferenz abgreifen?
Wie macht man sowas?
Für paar Tipps aus der Praxis oder Links auf verständliche Beispiele wäre ich euch dankbar.
Grüße aus der Bierstadt Einbeck
Der Pilstrinker
Moin,
in PHP gibt es Abstraktionen. Das sind Klassen die nicht selbst initialisiert werden können. Diese werden mit abstract gekennzeichnet.
Oder Interfaces. Das sind Baupläne nach deren muster du die Klasse implementieren musst.
Eine Klasse und später die Objekte sind nichts weiter als Hilfestellungen für deine Programme. Ein Objekt übernimmt eine gewisse Aufgabe. Was es wie macht sind durch Methoden definiert.
Das Objekt muss irgendwo initialisiert werden. Dort bestimmst du auch was genau du brauchst. Ich nenne solche Teile Controller, da sie kontrollieren was passiert. Wenn du einen Controller hast, der sich z.B. um das Speichern eines Users kümmert kann dir vielleicht die Klasse cUserVerwaltung helfen. Also wird diese initialisiert und entsprechend aufgerufen.
Mehrere Objekte können miteinander kommunizieren. Wie sowas passiert wird in einigen Softwarepatterns geregelt. Das sind paradigmen die immer wiederkehrende Probleme beschreiben und Lösungen anbieten.
Ein praktisches Beispiel. Nehmen wir an du willst den User wirklich speichern, dann könnte das Ganze so aussehen:
$arUser = array();
$arUser["name"] = $_POST['username'];
$arUser["geschlecht"] = $_POST['geschlecht'];
$objUserVerwaltung = new cUserVerwaltung();
$objUserVerwaltung->save( $arUser );
was in save passiert ist in dem Fall nicht einsehbar. Dabei spricht man von einer Blackbox. Wenn die Save Methode funktioniert kannst du an diesem Punkt 2 Dinge erwarten. Entweder das speichern ist erfolgreich oder es gab einen fehler. Wie damit verfahren wird möchte ich nicht näher ausführen.
Innerhalb von save können aber auch andere Objekte initialisiert werden. Save könnte vielleicht so aussehen:
public function save( $arUser )
{
//--- User Daten sind nicht korrekt eingegeben worden
if( !$this->check( $arUser ) )
{
return false;
}
$objDB = new cDatenbank(); //--- mysql Verbindung aufmachen
return $objDB->save("user", $arUser );
}
Das Ganze nennt man eine Komposition. Das Objekt $objDB existiert nur solange die Methode abläuft. Danach wird es wieder zerstört und der Speicher wird freigegeben. Bei diesem kleinen Beispiel braucht man es auch nicht länger.
Anders sieht der Fall aus wenn man von außen den Datenbank Typ definieren möchte. Wenn ich im Controller entscheiden möchte in welche Datenbank gespeichert wird. Dann sieht das Ganze so aus:
if( true )
$objDB = new cMySQL();
else
$objDB = new cMongoDB();
$objUserVerwaltung->save( $arUser, $objDB );
Das ist eine Aggregation. Das Objekt wird übergeben. Es bleibt länger am leben, als die Methode save abläuft.
Das sind nur 2 Softwarepattern von gut einem Dutzend. Mit der Zeit kommst du selbst drauf, da alle Softarepattern logisch aufgebaut sind. Deshalb bringt es meiner Meinung nach nichts die Dinger auswendig zu lernen.
Hoffe ich konnte Helfen
Gruß
Klassenbester
T-Rex
Hallo,
Wenn ich jetzt mehrere Klassen nebeneinander definiere, die alle Bestandteil meines Hauptprogrammes sind, wie kann dann die eine Klasse auf die Erkenntnisse (Eigenschaften) oder Methoden der anderen zugreifen?
Das Problem, das du ansprichst, nennt sich Dependency Management bzw. konkret Dependency Injection.
Muss ich das Objekt der ersten Klasse bei der Instatiierung der zweiten irgendwie übergeben?
Das ist eine Möglichkeit, ja. Letztlich läuft es darauf meist hinaus – wenn auch nicht manuell.
Oder kann ich mir auch so eine Art Klassen-Speicher bauen, in dem jede Schwesterklasse nachschauen kann, ob die andere Schwester schon aktiv war und dann dort die Objektreferenz abgreifen?
Einfach umgesetzt wäre das ein Singleton.
Sauberer umgesetzt wäre es ein Dependency-Injection-Container, der die Instantiierung und die Übergabe übernimmt. Dafür gibt’s verschiedene Hilfsmittel:
http://pimple.sensiolabs.org/
http://php-di.org/
http://de.slideshare.net/shochdoerfer/dependency-injection-in-php-dwx13
Mathias