Rolf B: Parameterübergabe von konventionellem PHP-Programm zu objektor. Programm

Beitrag lesen

Hallo Silja,

wie wird ein objektorientiertes Programm aus einem konventionellen PHP-Programm aufgerufen

Diesen Knoten im Kopf hat jeder mal gehabt.

Ein "objektorientiertes Programm" ist eine Sammlung aus Objekten. Eins davon ist normalerweise das Master-Objekt, das sich um das Anlegen weiterer Objekte kümmert. Diese können wiederum andere Objekte anlegen, und so weiter. Und über diesem Master-Objekt steht selbst in dem objektorientiertesten aller Programme ein konventionelles Programm, das den Job hat, das Masterobjekt zu erzeugen und eine erste Methode darauf aufzurufen.

Jedes dieser Objekte kann Verweise auf andere Objekte enthalten. An Hand dieser Verweise kann es diese Objekte benutzen. Es kann Daten darin speichern, oder Funktionen darin aufrufen (die man dann Methoden nennt).

PHP Programme gehören nicht zu den objektorientiertesten aller Programme. Hier hast Du immer einen konventionellen Script-Teil, und du kannst Dich entscheiden, ob deine Lösung konventionell baust, oder einen Teil davon mittels Objekten realisierst. Das nennt man ein hybrides Design. Es gibt PHP-Lösungen, die im konventionellen Teil tatsächlich nur das Master-Objekt erzeugen und sofort dessen Einstiegsmethode aufrufen. Kann man machen, muss man nicht.

Verwendet man fertige Bausteine, wie z.B. den PHPMailer, kann der selbstgeschriebe Code konventionell bleiben und man erzeugt nur bedarfsweise ein Mail-Objekt und kommuniziert damit. Das hast Du in deinem Beispiel: In der Variablen $mail ist ein Objekt zu finden, das Du vorher erzeugt hast. Wenn Du PHPMailer verwendest, hattest Du sicherlich irgendwo dies stehen:

$mail = new PHPMailer(...);

Was auch immer in den Klammern zu stehen hat - das sind Parameter, die an die Konstruktorfunktion des PHPMailer-Objekts übergeben werden und dazu dienen, das Mailer-Objekt gleich bei der Erzeugung an deine Wünsche anzupassen.

$mail ist eine PHP-Variable und enthält jetzt ein Objekt der PHPMailer-Klasse, und kennt damit einen Haufen Eigenschaften und Methoden. Eigenschaften sind sowas wie Variablen, aber nicht direkt im PHP-Speicher, sondern in einem Objekt. Die kannst Du wie normale Variablen verwenden, du musst nur immer das Objekt dazuschreiben, in dem sie stecken (denn man kann von einer Klasse viele Objekte haben und dann kann muss man angeben, mit welchem Objekt man denn arbeiten will).

Subject ist so eine Eigenschaft. Mit $mail->Subject sagst Du: Ich meine die Subject Eigenschaft in dem Objekt, das in $mail zu finden ist. Beim Arbeiten mit Eigenschaften wird nichts aufgerufen oder übergeben[1]. Du verwendest die Eigenschaft wie eine Variable. Du kannst ihr einen Wert zuweisen, oder sie wie eine Variable dorthin schreiben, wo Du ihren Wert brauchst. Das ist auch das Problem an Eigenschaften: Das Objekt kann nicht überprüfen, was Du speicherst. Es muss den Wert nehmen, wie Du ihn dorthin geschrieben hast.

Deswegen gibt es Informatiker, die öffentlich änderbare Eigenschaften für Teufelszeug erklären und verlangen, dass Eigenschaften nur gelesen werden sollten. Dazu deklariert man die Eigenschaften als private und stellt zum Lesen und Schreiben Methoden bereit, die man dann Getter und Setter nennt. Ein Setter kann erstmal prüfen, was gespeichert wird. Java zwingt Dich zu sowas, aber nicht PHP. Du kannst deine Klassen so schreiben, dass die Eigenschaften hinter Gettern und Settern versteckt sind. Aber du musst nicht. Und PHPMailer tut es nicht.

Von einer Parameterübergabe redet man nur bei Methoden. Die werden so wie Funktionen aufgerufen, und bekommen auch so wie Funktionen ihre Parameter. PHPMailer kann eine Mail an mehr als einen Empfänger schicken und bietet deshalb keine Eigenschaft für die Empfängerliste an, sondern eine Methode, mit der du der Empfängerliste, die im Objekt versteckt ist, einen Empfänger hinzufügen kannst:

$mail->addAddress("erika.mustermann@example.com");

Das ist ein Aufruf einer Methode in einem Objekt, und eine Parameterübergabe. Eine andere Methode von PHPMailer-Objekten heißt send, und damit geht die Mail dann 'raus.

Ich hoffe, das hat ein paar Denkblockaden lösen können. Das Verständnis kommt schrittweise, wenn man mal einfache Klassen selbst geschrieben hat. Das PHP Handbuch, auf das Raketenwilli auch schon verlinkte, hilft ein bisschen, ist aber kein didaktisches Wunder.

Rolf

--
sumpsi - posui - obstruxi

  1. Ja, es gibt magic methods, die diese Trennung aufweichen, und es gibt den Vorschlag, in PHP Accessor-Methoden einzuführen. Aber das führt hier zu weit. ↩︎