Übersicht » Einführung OOP
Was als erstes bei einem Vergleich mit den vorausgegangenen Beispielen auffallen dürfte, ist wohl, dass
der Code in diesem Beispiel wesentlich weniger aufgebläht erscheint. Allein die Klasse EmpfangMessage() hat sich um rund 20
Zeilen verkürzt. Diese Verkürzung liegt unter anderem daran, dass Host und GET nicht einzeln an die Klasse WieBot() zum Aufbau
einer Verbindung weitergereicht werden müssen.
Dabei kommt ein Vorteil der Objektorientierten Programmierung etwas mehr zur Geltung, denn das Formular und die Klasse
EmpfangMessage() lassen sich für unterschiedliche Aufgabenstellungen wieder verwenden, insofern es bei der Aufgabenstellung
darum gibt, eine vom Nutzer eingegebene URL zu filtern und für die weitere Verarbeitung aufzubereiten.
Falls Sie beabsichtigen dieses Script zu testen, überzeugen Sie sich zuvor, ob der cURL Support ermöglicht ist. Kontrollieren
Sie, ob in der PHP-Info ein Eintrag mit cURL support enabled existiert. Sollte dies nicht der Fall sein, suchen Sie in der
php.ini nach dem Eintrag extension=php_curl.dll und entfernen das Semikolon vor diesen Eintrag, vorausgesetzt es besteht Zugriff
auf die php.ini.
Wie die bereits vorgestellten Scripts, so liefert auch dieses Script eine Ausgabe an den Browser, die den HTTP Message Header
und den Message Body enthält, insofern die URL erfolgreich aufgerufen und eine Verbindung zum Server hergestellt werden konnte.
Dieses Script wird nachfolgend in zwei Varianten vorgestellt.
Bei der ersten Variante wird auf eine Vererbung von Eigenschaften und Methoden verzichtet. Der Vorteil
besteht darin, dass sich beide Klassen unabhängig voneinander in unterschiedlichen Scripts verwenden lassen. Damit ist jedoch
ein kleiner Nachteil verbunden, ohne Vererbung müssen zwei Objekte erzeugt und instanziiert werden, mit Vererbung hingegen nur
ein Objekt.
Code-Listing (Formular- und cURL-Klasse ohne Vererbung):
<?php error_reporting(E_ALL); /*-- Überprüfung der vom Formular übermittelten URL ---------------------------*/ class EmpfangMessage { private $dompath = ""; private $domain = "www.example.com"; public function pruefeMessage() { if (isset($_GET["abrufen"]) and !empty($_GET["abrufen"])) { $abrufen = trim($_GET["abrufen"]); $hrefpos = stripos($abrufen, "http://"); $abrufen = preg_replace("/[^a-zA-Z0-9.:?&\/=_-]/", "", $abrufen); if ($hrefpos === false) { $abrufen = "http://".$abrufen; } $this->dompath = $abrufen; return $this->dompath; } else { $this->dompath = $this->domain; return $this->dompath; } } } /*-- Klasse zur Initialisierung und Ausführung einer cURL-Session -------------*/ class WieBot { public $antwort = ""; private $agent = "User-Agent: Mozilla/5.0 (compatible; Demo Botklasse 0.3)"; public function getVerbindung() { $cwbot = curl_init($this->antwort); // cURL-Session initialisieren curl_setopt($cwbot, CURLOPT_HEADER, true); // Response Header mit in die Ausgabe aufnehmen curl_setopt($cwbot, CURLOPT_USERAGENT, $this->agent); // User Agent für den Request Header setzen curl_setopt($cwbot, CURLOPT_RETURNTRANSFER, true); // Rückgabe als String if (curl_exec($cwbot) !== false) { $this->antwort = curl_exec($cwbot); // Ausführung der cURL-Session } else { $this->antwort = "Fehler: ".curl_error($cwbot); // oder eine Fehler-Mitteilung ausgeben } curl_close($cwbot); // Session beenden und Resourcen freigeben return $this->antwort; } } /*-- Vorbereitungen für die Ausgabe -------------------------------------------*/ $vonform = new EmpfangMessage(); // Erzeugen und Instanziieren des Objektes EmpfangMessage $fuerant = $vonform->pruefeMessage(); // Rückgabewert der Methode pruefeMessage der Variablen $fuerant zuweisen $vonbot = new WieBot(); // Erzeugen und Instanziieren des Objektes WieBot $vonbot->antwort = $fuerant; // $antwort die übernommenen Werte der Eigenschaften zuweisen $ausgabe = $vonbot->getVerbindung(); // Rückgabewert der Methode getVerbindung für Ausgabe ?> <!DOCTYPE html> <html> <head> <title>Abruf wie durch Bot</title> </head> <body> <div style="text-align:center"> <h1>Abruf wie durch Bot</h1> <?php echo htmlentities($fuerant, ENT_QUOTES)."<br>\n"; ?> <form action="<?php echo basename($_SERVER["PHP_SELF"]); ?>" method="get"> <input type="text" name="abrufen" size="60" maxlength="120"><br> <input type="reset" value=" Reset "> <input type="submit" value=" Senden "> </form> </div> <?php echo "<pre>".htmlentities($ausgabe, ENT_QUOTES)."</pre>"; ?> </body> </html>
Im Beispiel enthält die Klasse WieBot() die Methode getVerbindung(). Wird nun ein Objekt WieBot erzeugt
und instanziiert, weiterhin eine URL als Wert der Eigenschaft $antwort zugewiesen sowie die Methode getVerbindung() aufgerufen,
so wird mit curl_init eine cURL-Session initialisiert. Mit der Funktion curl_setopt lassen sich unterschiedliche Option für die
Verbindung und Datenübertragung setzen, die an die jeweilige Aufgabenstellung angepasst werden können.
Bei dieser Variante mit Vererbung wird die Formular-Klasse EmpfangMessage zur Elternklasse, von der die
Kindklasse WieBot die Eigenschaften und Methoden erbt. Im nachfolgenden Code-Listing werden nur die Code-Abschnitte aufgeführt,
die sich gegenüber Variante I veränderten.
Zu diesen Veränderungen gehört, dass die Elternklasse EmpfangMessage mehr gekapselt wurde, womit weder die Eigenschaften noch
die Methode pruefeMessage öffentlich zugänglich sind. Weiterhin wurde in der Kindklasse WieBot zusätzlich die Methode
getAdresse definiert, um die protected Methode pruefeMessage aus der Elternklasse aufzurufen und auszuwerten.
Ein Vorteil bei Variante II mit Vererbung besteht unter anderem darin, dass nur noch ein Objekt erzeugt und instanziiert werden
muss, um die volle Funktionalität der Klassen nutzen zu können. Als ein Nachteil könnte hingegen angesehen werden, dass sich
beide Klassen nicht mehr unabhängig voneinander für andere Aufgabenstellungen verwenden lassen.
Verändertes Code-Listing (Formular- und cURL-Klasse mit Vererbung):
<?php error_reporting(E_ALL); /*-- Überprüfung der vom Formular übermittelten URL ---------------------------*/ class EmpfangMessage { private $dompath; private $domain = "www.example.com"; protected function pruefeMessage() { /* Aus der public function wurde eine protected function ... */ /* ... der restliche und unveränderte Code ... */ } } /*-- Klasse zur Initialisierung und Ausführung einer cURL-Session -------------*/ class WieBot extends EmpfangMessage { private $antwort; // Aus public wurde private private $agent = "User-Agent: Mozilla/5.0 ..."; public function getAdresse() { // Eine zusätzliche Funktion getAdresse return $this->pruefeMessage(); // Aufruf der geerbten Funktion pruefeMessage } public function getVerbindung() { $this->antwort = $this->pruefeMessage(); $cwbot = curl_init($this->antwort); // cURL-Session initialisieren /* ... der restliche und unveränderte Code ... */ } } /*------------------------------------------------------------------------------- Die Vorbereitungen für die Ausgabe haben sich vereinfacht, da nur noch ein Objekt erzeugt und instanziiert werden muss. -------------------------------------------------------------------------------- */ $vonbot = new WieBot(); // Erzeugen und Instanziieren des Objektes WieBot $fuerant = $vonbot->getAdresse(); // Die per Formular übergebene URL bzw. Webadresse mit getAdresse() ermitteln $ausgabe = $vonbot->getVerbindung(); // Rückgabewert der Methode getVerbindung für die Ausgabe ?>
Die Frage, welcher Variante der Vorzug zu geben ist, kann nicht pauschal beantwortet werden, da letztendlich beide Varianten Vor- und Nachteile besitzen.
Einstieg in PHP
Übersicht
Diverse Themen