Folien



(letzte Synchronisation der PDF-Präsentation: 02.03.2017)

Falls keine PDF-Präsentation zu sehen ist, klicken Sie zum Download hier: Direktdownload PDF-Präsentation

Durch die Verwendung von Zugriffsbeschränkungen (Zugriffsmodifikatoren) (private, protected) werden Eigenschaften unsichtbar bzw. nicht zugreifbar und werden durch Getter- und Setter-Methoden ("Zugriffsmethoden") ersetzt (vgl. Geheimnisprinzip). Manche IDEs können Getter- und Setter-Methoden automatisch generieren (für PHP: NetBeans, für Java: Eclipse).

Getter-Methode

Keine Parameter. Gibt den Wert einer Eigenschaft aus, Syntax (einfach):

PHP-Code
  public function getEigenschaft() { return $this->eigenschaft; }  

Wenn man keine Getter-Methode einrichtet, ist die Eigenschaft von außen nicht lesbar.

Während einfache Getter-Methoden (wie die oben) einfach nur den Wert einer Eigenschaft zurückgeben, können erweiterte Getter-Methoden Werte zurückgeben, die nicht in einer Eigenschaft gespeichert sind, z.B.

PHP-Code
  public function getMehrwertsteuerBetrag() { // Mehrwertsteuerbetrag aus Brutto berechnen return $this->bruttopreis*($this->mehrwertsteuerSatz/(100+$this->mehrwertsteuerSatz)); }  

oder

PHP-Code
  public function getNettobetrag() { // Nettobetrag aus Brutto berechnen return $this->bruttopreis*100/(100+$this->mehrwertsteuerSatz)); }  

Setter-Methode

Hat einen Parameter, der den neuen Wert einer Eigenschaft enthält. Dieser Wert wird durch die Settermethode der Eigenschaft zugewiesen, z.B.

PHP-Code
  public function setMehrwertsteuer($steuersatz) { // Steuersatz setzen $this->steuersatz = $steuersatz; }    

Erstellen Sie Getter-/Setter-Methoden, um den Zugriff auf Eigenschaften zu gewähren. So kann man Überprüfungen und Umwandlungen realisieren, Lese-/Schreibzugriff getrennt verwalten und zusätzliche Zustandswerte nach außen anbieten, die aber nicht fest gespeichert werden. Verwenden Sie die Zugriffsmethoden auch intern. …
Nachteilig ist lediglich der Schreibaufwand, der leider gerade im PHP-Bereich erheblich ist, weil nur wenige große Entwicklungsumgebungen eine Werkzeugunterstützung für die Erstellung von Getter- und Setter-Methoden anbieten. (Skulschuss 2007:39)

Übungen

Alle Übungen finden Sie in der Materialsammlung (dort auch alle zusätzlichen Dateien wie Bilder, Klassendiagramme oder HTML-Vorlagen!).

Die aktuelle Übung können Sie hier als txt-File herunterladen.


***** Übungen: PHP/OOP - Getter und Setter *****

PHP/OOP_6-0: Setter und Getter - Kuh

Programmieren Sie die Klasse Kuh wie im Bild 10phpoop/oopphp06-bild-kuh_SEHREINFACH.png LINK* (wenn Sie sich schon etwas sicherer fühlen, nehmen Sie bitte *LINK 10phpoop/oopphp06-bild-kuh.png ).

Probieren Sie die Getter und Setter aus, indem Sie zwei neue Objekte der Klasse instanziieren und die Getter/Setter-Methoden verwenden.






PHP/OOP_6-1: Setter und Getter - Kunde

Gegeben sei folgende Klasse:

PHP-Code
class Kunde { // Attribute   private $kontostand; private $geheimzahl;   // Methoden // Getter: Kontostand //...   // Setter: Kontostand // ...   // Getter: Geheimzahl // ...   // Setter: Geheimzahl // ... }   $schmitt = new Kunde;   // Kontostand verändern $schmitt->setKontostand(1000);   // Kontostand ausgeben $schmitt->getKontostand();   // Geheimzahl verändern $schmitt->setGeheimzahl(1321);   // Geheimzahl überprüfen $eingabeausBankingFormular = 1324; // auf 1321 ändern, // um funktionalität zu überprüfen if ($schmitt->getGeheimzahl() == $eingabeausBankingFormular) { echo "zugang gewährt!"; } else { echo "zugang verweigert"; }    

Schreiben Sie die entsprechenden Getter und Setter.
Überprüfen Sie die Lauffähigkeit des Skripts.





PHP/OOP_6-2: Setter und Getter: Login-Routine Online-Banking - Übersicht

Sie sollen eine objektorientierte Login-Routine für ein Online-Banking-System schreiben, die folgende Anforderungen erfüllt:
1) Über ein Web-Formular gibt der Kunde seinen Nachnamen und seine Geheimzahl ein.
2) Name und Geheimzahl werden mit aus einer Datenbank geholt und auf Übereinstimmung geprüft. Bei fehlerhaften Eingaben erhält der Kunde eine entsprechende Fehlermeldung ("Kunde nicht in DB vorhanden" usw.).
3) Wenn der Kunde sich korrekt eingeloggt hat, erhält er die Meldung "Zugang gewährt" und die Ausgabe seines Kontostands.

Programmiertechnische Anforderungen:
- Erstellen Sie die Klassen wie in Abb. 10phpoop/oopphp06-bild-login_onlinebanking.png
- Empfehlung: Beim Instanziieren eines neuen Kunden greifen Sie im Konstruktor mittels der Klasse Dbconnect auf die DB zu und lesen die gewünschten Daten aus (nämlich die Geheimzahl, die zum Namen gehört, der in das Formular eingegeben wurde).




PHP/OOP_6-2_a): Login-Routine, Schritt a) - Klasse "Kunde" erzeugen

Erzeugen Sie wie im Klassendiagramm 10phpoop/oopphp06-bild-login_onlinebanking.png dargestellt eine Klasse Kunde (Dateiname: kunde.class.php). Der Konstruktor wird angelegt, bleibt aber erst mal leer.

Testen Sie die Lauffähigkeit, indem Sie
- ein neues Objekt $kundeSchmitt erzeugen;
- den Kontostand von $kundeSchmitt mit dem Setter setKontostand auf 1000 setzen;
- sich den Kontostand von $kundeSchmitt mit dem Getter getKontostand ausgeben lassen.




PHP/OOP_6-2_b): Login-Routine, Schritt b) - Datenbank "kunden" anlegen

Erstellen Sie eine MySQL-Tabelle "kunden" mit vier Feldern:
- id (int, AI, PK)
- name (varchar)
- geheimzahl (int)
- kontostand (float)

Tragen Sie zwei Kunden mit einfachen Zugangsdaten testweise ein (z.B. "schmitt", geheimzahl 1111).




PHP/OOP_6-2_c): Login-Routine, Schritt c) - Datenbankverbindung öffnen

Erstellen Sie die Klasse Dbconnect (Dateiname: dbconnect.class.php).

Die kann so aussehen:

PHP-Code
  <?php     class Dbconnect { //attribute   // methoden public static function dbVerbindungOeffnen() { $host = 'localhost'; $username = 'root'; $passwort = ''; $db_name = 'kunden';   $link = mysql_connect($host, $username, $passwort) or die('Verbindungsdaten nicht korrekt!'); mysql_select_db($db_name) or die('keine Verbindung zur ausgewaehlten datenbank moeglich!'); }   } ?>    

Im Konstruktor der Klasse Kunde öffnen Sie die Datenbankverbindung, indem Sie ein neues Objekt $neueDbVerbindung o.ä. instanziieren und für das Objekt die Methode dbVerbindungOeffnen ausführen.
Vergessen Sie nicht, die Klasse Dbconnect an geeigneter Stelle einzubinden (z.B. zu Beginn des Konstruktors).

(Hinweis: Sie könnten die DB-Verbindung natürlich auch ohne eigene Klasse direkt im Konstruktor von "Kunde" herstellen. Wartungsfreundlicher und übersichtlicher ist es jedoch, wenn die DB-Verbindung eine eigene Klasse erhält.)

Für Fortgeschrittene: Damit Sie nicht jedesmal ein eigenes Objekt von Dbconnect erzeugen müssen, können Sie mit einer statischen Methode arbeiten (diese Methode kann verwendet werden, ohne dass ein dazugehöriges Objekt existiert). Dazu definieren Sie die Methode dbVerbindungOeffnen wie folgt:

PHP-Code
public static function dbVerbindungOeffnen()  

Dann können Sie die statische Methode aufrufen, ohne ein Objekt zu instanziieren:

PHP-Code
Dbconnect::db_verbindung_oeffnen();  




PHP/OOP_6-2_d): Login-Routine, Schritt d) - Formular erzeugen

Erzeugen Sie in einer Datei index.php eine Oberfläche mit zwei Eingabefeldern, wo der Kunde seinen Namen und seine Geheimzahl eingeben kann.
Fangen Sie in index.php Fehlermeldungen (nicht definiertes $_POST-Array) ab.
Lesen Sie in index.php das $_POST-Array aus und weisen Sie entsprechende Variablen zu (z.B. $geheimzahl für die eingegebene Geheimzahl).

Testen Sie die Lauffähigkeit, in dem nach dem Absenden des Formulars eine Ausgabe wie "Sie haben folgende Werte eingegeben: Geheimzahl - 1234, Name - Smith" erzeugt wird.




PHP/OOP_6-2_e): Login-Routine, Schritt e) - Daten aus DB holen

Wenn das Formular erfolgreich abgeschickt wurde, erzeugen Sie ein neues Objekt namens $kunde. Diesem Objekt geben Sie den in das Formular eingetragenen Namen als Parameter mit, z.B.

PHP-Code
$kunde = new Kunde($name)  

Führen Sie im Konstruktor der Klasse Kunde eine MySQL-Abfrage aus, mit der die Geheimzahl ermittelt wird, die zum eingegebenen Namen gehört. Für die MySQL-Abfrage können Sie Ihre Kenntnisse in 08phpmysql/phpmysql03_mysql_query-abfragenausfuehren.pdf auffrischen.

Als Ergebnis der Abfrage erhalten Sie die Geheimzahl des Objekts. Weisen Sie diese Geheimzahl der Objektvariablen $this->geheimzahl zu.

Für Fortgeschrittene:
Sie können bereits an dieser Stelle mit mysql_num_rows überprüfen, ob es zum eingegebenen Namen überhaupt einen Kunden in der DB gibt und eine entsprechende Fehlermeldung definieren.




PHP/OOP_6-2_f): Login-Routine, Schritt f) - Daten abgleichen

Jetzt müssen Sie nur noch in index.php überprüfen, ob die Geheimzahl des Kunden mit der ins Formular eingegebenen Geheimzahl übereinstimmt. Ist das der Fall, können Sie den Zugang gewähren und den Kontostand ausgeben (den Sie mit $kunde->getKontostand auslesen können). Stimmt die in der DB vorhandene Geheimzahl nicht mit der ins Formular eingegebenen überein, muss eine Fehlermeldung ausgegeben werden.




PHP/OOP_6-2_g): Login-Routine, Schritt g) - Ausbau (fortgeschritten)

Ergänzen Sie das vorhandene Programm:
- Der Kontostand soll in der DB gespeichert sein und wird aus der DB geholt (statt wie bisher als Initialwert).
- Es gibt zwei zusätzliche Methoden "einzahlen" und "abheben", die den Kontostand entsprechend verändern und in der DB festhalten. Außerdem wird eine entsprechende Meldung ausgegeben ("Sie haben 200 Euro abgehoben. Ihr neuer Kontostand beträgt nun xy Euro."). Es empfiehlt sich, die Meldung mit einer eigenen Methode auszugeben (meldungAusgeben); die Meldung (oder ihre einzelnen Bestandteile) wird/werden in der jeweiligen Methode definiert und dann an meldungAusgeben übergeben (-> vgl. MVC-Architektur).
- Nach dem Einloggen kann der User also wählen "einzahlen", "auszahlen" und "Kontostand abfragen". Dazu muss Ihr Skript auf der Zielseite aber noch wissen, wer eingeloggt ist. Sie haben mehrere Möglichkeiten, z.B.
--- Übergabe des Formulars mit einem versteckten Feld (Google-Suche: "html form hidden field")
--- Nutzung von Sessions (Google-Suche: "php session"). Hier wäre es sinnvoll, wenn die Session das Objekt übergeben würde; das müssen Sie aber in eine für Sessions lesbare Repräsentation umwandeln, hierzu benutzen Sie serialize() bzw. unserialize. Das kann so funktionieren:

PHP-Code
// Objekt in Session speichern $objekt = serialize($objekt); $_SESSION['objekt'] = $objekt;   // In Session gespeichertes Objekt in ein für PHP lesbares Objekt umwandeln   $objekt = unserialize($_SESSION['objekt']);    

Benutzen Sie das php-Manual unter php.net/manual (um weitere Infos zu serialize() bzw. unserialize() zu bekommen).





PHP/OOP_6-2_h): Login-Routine: Vervollständigen

Benutzen Sie für diese Übung die Dateien in diesem Verzeichnis (Materialsammlung):
10phpoop/oopphp06-projekt_login-routine-unvollstaendig

1) Legen Sie ein neues Netbeans-Projekt aus diesem Verzeichnis an. Importieren Sie die Kundendaten (kunden_db.sql) mittels phpmyadmin in eine DB. Kontrollieren Sie die Zugangsdaten zur Datenbank (db_connect.php).

2) Sie müssen drei Zeilen ergänzen:
- in formular.php Zeile 18 (IF-Abfrage)
- in kunde.class.php Zeile 22 (SQL-Statement definieren)
- in kunde.class.php Zeile 39 (WHILE-Schleife, um Daten aus DB auszulesen)






PHP/OOP_6-3a: Setter und Getter - Rechnung

- Schreiben Sie die Klasse, die im Bild 10phpoop/oopphp06-bild-rechnung-klasse.png dargestellt ist. Speichern Sie unter rechnung.class.php
- Instanziieren Sie in index.php ein neues Objekt $rechnung. Sie müssen dazu ganz oben im Dokument die im letzten Schritt erstellte Klasse mit require_once einbinden.
- Setzen Sie mit den Settern die Rechnungsumme auf 253 und die Rabattstufe auf 20 (das bedeutet: 20% Rabatt).
- Holen Sie mit den Gettern die Rabattstufe und den Rechnungsbetrag des Objekts und berechnen Sie den Endbetrag. Geben Sie den Endbetrag in der Form "Rechnungsbetrag: 253,00; Rabatt: 50,60; Zahlungsbetrag: 202,40 Euro." aus.




PHP/OOP_6-3b: Setter und Getter mit Oberfläche

Benutzen Sie für diese Aufgabe Ihr Skript von 6_3a.

- Erstellen Sie ein HTML-Formular, wo Rechnungsbetrag + Rabattstufe eingegeben werden können (mit Button: "Daten speichern und Endbetrag berechnen").
- Nach Eingabe der Daten und Absenden des Formulars soll die oben genannte Ausgabe erfolgen.




PHP/OOP_6-3c: Rechnung: Datenbankanbindung (schwer!)

Erweitern Sie Aufgabe 6-3 um diese Möglichkeiten:

- Nach Klick auf "Daten speichern" werden Rechnungsbetrag und Rabattstufe in eine Datenbanktabelle geschrieben (die Rechnung bekommt eine automatische Nummer über ein Feld "id" mit AUTO_INCREMENT).
- Erstellen Sie ein weiteres Formular (am besten auf der gleichen Seite), wo eine Rechnungsnummer eingegeben werden kann; nach Klick auf den Button "Rechnungsdaten ausgeben" werden die zur Rechnungsnummer zugehörigen Daten ausgegeben.

Tipps/Hinweise:
- Erstellen Sie für die DB_Verbindung eine eigene Klasse (dbconnect.class.php) - Beispiel unten. Wenn Sie die DB-Verbindung öffnen wollen, instanziieren Sie ein entsprechendes Objekt und benutzen die entsprechende Methode (im Beispiel unten: db_verbindung_oeffnen()).
- Um zu überprüfen, ob schon eine Rechnung mit der eingegebenen Nummer vorhanden ist, benutzen Sie mysql_num_rows ( http://php.net/manual/de/function.mysql-num-rows.php ).

PHP-Code
  <?php     class Dbconnect { //attribute   // methoden public static function db_verbindung_oeffnen() { $host = 'localhost'; $username = 'root'; $passwort = ''; $db_name = 'rechnungen';   $link = mysql_connect($host, $username, $passwort) or die('Verbindungsdaten nicht korrekt!'); mysql_select_db($db_name) or die('keine Verbindung zur auswaehlten datenbank moeglich!'); }   } ?>    




PHP/OOP_6-4: Setter/Getter automatisch erzeugen

Erzeugen Sie die Klasse "Kunde" entsprechend dem Klassendiagramm 10phpoop/oopphp06-bild-kunde-klasse.png

Benutzen Sie dabei die Möglichkeit, Getter und Setter automatisch von NetBeans erzeugen zu lassen (alt + Einfügen).