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

Hallo,
wie wird ein objektorientiertes Programm aus einem konventionellen PHP-Programm aufgerufen und wie kann ich im folgenden Statement

$mail->Subject = 'Here is the subject';

den Text 'Here is the subject' als Parameter übergeben?

  1. $mail->Subject = 'Here is the subject';
    

    Ja, die Syntax stimmt. (Genauer: Es kommt darauf an, ob a) Dein mail-Objekt eine Eigenschaft "Subject" hat, ob b) diese öffentlich und c) (ohne Setter) beschreibbar ist.)

    https://www.php.net/manual/de/language.oop5.basic.php

    Besser wäre es aber, wenn die Eigenschaft nicht direkt belegt werden kann, weil im Subjekt längst nicht alles erlaubt ist. Nehmen wir Zeilenumbrüche…

    class Mail {
         private $Subject = 'Not set.';
         # …
    
         function setSubject( $str ) {
             if ( jede Menge  Prüfungen ) {
                 $this->Subject = $str;
                 return true;
             } else {
                 return false;
             }
        }
    
        # …
    
    }
    
    1. Leider verstehe ich nur Bahnhof. Für mich ist das oo-Programm eine Black-Box.

      1. Leider verstehe ich nur Bahnhof. Für mich ist das oo-Programm eine Black-Box.

        Du hast die Wahl zwischen „Stricken gehen“ und „Hinsetzen und lernen“.

        https://www.php-einfach.de/experte/objektorientierte-programmierung-oop/

        das oo-Programm eine Black-Box

        Für mich ist eine Blackbox, was Du mit „oo-Programm“ meinst. Gib den Dingen die richtigen Namen - die haben die vorliegend nicht zufällig.

  2. 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. ↩︎

    1. Ich erkläre das - wegen der Offenkundigkeit - immer noch mit dem selbsterklärendem Beispiel Auto ...

      <?php
      
      class Car {
      
      	const MaxSpeed = 150;
      	const Colors   = [ "white", "black", "red" ];
      	private $speed = 0;
      	private $color;
      	const Price = 30000;
      	const PriceExtraColor  = 2000;
      	private $price;
      	public $nickname;
      
      	function __construct( $color = false )  {
      		if ( $color == false ) {
      			$color = self::Colors[ 0 ];
      		} 
      		trigger_error( "Hinweis: Es wurde die Farbe '$color' gewählt.", E_USER_NOTICE );
      		$this->setColor( $color );
      		
      	}
      
      	private function setColor ( $color ) {
      		$this->color = strtolower( trim( $color ) );
      
      		if ( ! in_array( $color, self::Colors ) ) {
      			$this->price = self::Price + self::PriceExtraColor;
      			trigger_error( "Hinweis: Es wird auf Grund der Farbangabe '$color' ein Zuschlag berechnet.", E_USER_NOTICE );
      		} else {
      			$this->price = self::Price;
      		}
      	}
      
      
      
      	function speedUp( $val ) {
      		if ( ! is_numeric( $val ) ) {
      			trigger_error( 'Fehler: Es wurde keine Zahl übergeben', E_USER_ERROR );               
      			return false;
      		}
      		if ( self::MaxSpeed <= ( $this->speed + $val ) ) {
      			$this->speed = self::MaxSpeed;
      			trigger_error( 'Notiz: MaxSpeed erreicht', E_USER_NOTICE ); 
      		} else {
      			$this->speed = $this->speed + $val;
      		}
      
      		if ( $this->speed < 0 ) {
      			$this->speed = 0;
      		}
      		return true;
      	}
      
      	function speedDown( $val ) {
      		if ( 'full' == $val ) {
      			$this->speed = 0;
      		} else {
      			$this->speedUp( -1 * abs( $val ) );
      		}
      		return true;
      	} 
      
      	public function getColor() {
      		return $this->color;	
      	}
      
      	public function getPrice() {
      		return $this->price;	
      	}
      
      	function getSpeed() {
      		return $this->speed;
      	}   
      
      }
      
      $myCars=[];
      $myCars[0] = new Car();
      $myCars[0]->nickname = "Dienstwagen";
      
      $myCars[1] = new Car('grün');
      $myCars[1]->nickname = "Frosch";
      
      foreach ( [0,1] as $i ) {
      	echo "Auto mit Spitzname '" ,$myCars[ $i ]->nickname, "' in ", $myCars[ $i ]->getColor(), " kostet ", $myCars[ $i ]->getPrice(), PHP_EOL;
      	echo "Fährt jetzt:", $myCars[ $i ]->getSpeed(), PHP_EOL, PHP_EOL;
      
      	echo "Versuche, um 20 zu beschleunigen...", PHP_EOL;
      	$myCars[ $i ]->speedUp( 20 );
      	echo "Fährt jetzt:", $myCars[ $i ]->getSpeed(), PHP_EOL, PHP_EOL;
      
      	echo "Versuche, um 150 zu beschleunigen...", PHP_EOL;
      	$myCars[ $i ]->speedUp( 150 );
      	echo "Fährt jetzt:", $myCars[ $i ]->getSpeed(), PHP_EOL, PHP_EOL;
      
      	echo "Versuche, um 45 zu bremsen...", PHP_EOL;
      	$myCars[ $i ]->speedDown( 45 );
      	echo "Fährt jetzt:", $myCars[ $i ]->getSpeed(), PHP_EOL, PHP_EOL;	
      
      	echo "Versuche Vollbremsung...", PHP_EOL;
      	$myCars[ $i ]->speedDown('full');
      	echo "Fährt jetzt:", $myCars[ $i ]->getSpeed(), PHP_EOL, PHP_EOL, PHP_EOL;
      }
      

      Ausgaben:

      
      PHP Notice:  Hinweis: Es wurde die Farbe 'white' gewählt. in /home/fastix/test.php on line 18
      PHP Notice:  Hinweis: Es wurde die Farbe 'grün' gewählt. in /home/fastix/test.php on line 18
      PHP Notice:  Hinweis: Es wird auf Grund der Farbangabe 'grün' ein Zuschlag berechnet. in /home/fastix/test.php on line 28
      Auto mit Spitzname 'Dienstwagen' in white kostet 30000
      Fährt jetzt:0
      
      Versuche, um 20 zu beschleunigen...
      Fährt jetzt:20
      
      Versuche, um 150 zu beschleunigen...
      PHP Notice:  Notiz: MaxSpeed erreicht in /home/fastix/test.php on line 43
      Fährt jetzt:150
      
      Versuche, um 45 zu bremsen...
      Fährt jetzt:105
      
      Versuche Vollbremsung...
      Fährt jetzt:0
      
      
      Auto mit Spitzname 'Frosch' in grün kostet 32000
      Fährt jetzt:0
      
      Versuche, um 20 zu beschleunigen...
      Fährt jetzt:20
      
      Versuche, um 150 zu beschleunigen...
      PHP Notice:  Notiz: MaxSpeed erreicht in /home/fastix/test.php on line 43
      Fährt jetzt:150
      
      Versuche, um 45 zu bremsen...
      Fährt jetzt:105
      
      Versuche Vollbremsung...
      Fährt jetzt:0
      
      1. Hallo,

        ein selbsterklärendes Beispiel sollte nicht erklärt werden müssen :)

        Gruß Peter

        1. Servus!

          Hallo,

          ein selbsterklärendes Beispiel sollte nicht erklärt werden müssen :)

          Du hast Recht!

          Und deshalb gab's nen Script und die Ausgabe dazu.

          Herzliche Grüße

          Matthias Scharwies

          --
          Die Signatur findet sich auf der Rückseite des Beitrags.
      2. Hallo Raketenwilli,

        ein selbsterklärendes Beispiel sollte nicht erklärt werden müssen :)

        Und nicht nur Männer schrauben an Autos. Dieser Titel hat eine Moderationsmeldung wegen Sexismus ausgelöst…

        Wobei sich Selfhtml ja die Meinungen der Poster nicht zu eigen macht. Deswegen werde ich hier nicht anfangen, Thread-Überschriften zu editieren

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Dieser Titel hat eine Moderationsmeldung wegen Sexismus ausgelöst…

          Ernsthaft? Diese Meldung löst bei mir ein wirklich ganz großes „Unwohlsein“ deswegen aus, weil der provokante Charakter des „Nur für Männer“ trotz des ASCII-Smileys mit dem zugekniffenem Auge → ;-) ← nicht erkannt wurde.

          Wie bekommt man eigentlich seine Synapsen so verdrahtet, dass die jeden Text - mit zu einem Tunnelblick führenden Scheuklappen - nach etwas untersuchen, was dem selbstsauren Moralin nicht standhält?

          Wie ich das sehe ist eine solche moralinsaure und jede Art von Humor vernichtende Haltung letztendlich abschreckend und fördert durch diese Abschreckung nicht das behauptete Ziel sondern eine bestimmte politische Partei - gegen die ich übrigens letztes Wochenende auf der Straße war.

          Und, bevor die Frage wegen des anderen Posts kommt, "Geh stricken oder lerne" sagt man zu Personen, die eine gewisse Uneignung oder Unwille erkennen lassen in dem diese z.B. im Trabant 601 nach dem Zündverteiler suchen.

          1. Hallo Raketenwilli,

            jeder hat seinen eigenen Moralin-Level. Und der Smiley, der den Scherz verdeutlicht, ändert nichts daran, dass ein sexistischer Scherz gemacht wurde.

            Wir alten Männer sind da eher unempfindlich, jüngere Männer sind anders sozialisiert und deshalb empfindlicher (was ich in der kurzen Diskussion zum Thema in der Moderatorenrunde bemerkt habe). Und Frauen werden davon vermutlich abgestoßen. Es sei denn, sie sind durch den Umgang mit alten Männern hinreichend abgehärtet…

            Deswegen ist es besser, sich um PC zu bemühen. Leider führt die erbärmliche Frauenquote im Moderatorenteam und auch im Forum dazu, dass wir die weibliche Sicht dieses Thema nicht erfahren werden. Ob „Silja“ weiblich ist und sich über die Überschrift geärgert hat? Vielleicht erfahren wir es noch.

            So, und nun lass uns das Thema beschließen. Im Zweifelsfall einigen wir uns darauf, dass wir uneinig sind.

            Rolf

            --
            sumpsi - posui - obstruxi
    2. Lieber Rolf,

      $mail->Subject [...] Das Objekt kann nicht überprüfen, was Du speicherst. Es muss den Wert nehmen, wie Du ihn dorthin geschrieben hast.

      das habe ich gerade überprüft und musste feststellen, dass PHPMailer hier wirklich keinerlei Überprüfung vornimmt:

          /**
           * The Subject of the message.
           *
           * @var string
           */
          public $Subject = '';
      

      Dieser Code ist direkt von der Projektseite und zeigt, dass die Eigenschaft mit exakt dem Wert befüllt wird, den man zuweist. Das muss aber in diesem Fall nicht schlecht sein! Erst beim Versenden der Mail (also bei $mail->send()) wird wichtig, wie mit den Daten in dieser Eigenschaft verfahren werden soll. Weil insbesondere nicht-ASCII-Zeichen (und auch nicht erlaubte) passend kodiert (oder ignoriert) werden müssen, findet die Überprüfung also indirekt und später statt.

      Liebe Grüße

      Felix Riesterer