Websiteentwicklung: PHP: OOP

Was ist OOP? Bearbeiten

OOP bedeutet Objektorientiertes Programmieren, was aber wohl noch nicht den gewünschten "Aha"-Effekt hervorrufen sollte. Was ist also ein Objekt?

Objekte helfen uns, Abbildungen der Wirklichkeit in der Programmiersprache zu realisieren. In OOP werden ähnliche Gegenstände als Klassen zusammengeführt und Objekte als Instanzen dieser Klassen erzeugt: Alle Hunde sind somit Instanzen der Klasse „Hund“, alle Häuser Instanzen der Klasse „Haus“ usw.

Nehmen wir unseren Freund, den Baum: Bäume sehen in der Regel alle gleich aus: Sie sind groß, grün und werfen Schatten (das nennt man die Eigenschaften (engl. properties) der Klasse). Einige davon sind nicht mehr allzu gesund, andere sind so arrogant und wollen unterschieden haben, ob sie Eiche, Esche oder Kastanie sind. Nun wissen wir aus der Fantasy-Literatur (z.B. T. A. Barron oder J.R.R Tolkien), dass es möglich ist mit Bäumen zu kommunizieren (und sie zu fragen, ob sie nun Eiche, Esche, Kastanie; groß, klein, gesund oder tot sind; wie sie heißen). Gehen wir von einem Helden Foo aus, der mit dem Baum Bar kommuniziert. Formal heißt das, dass Foo eine Instanz der Klasse "Held" ist, und Bar eine Instanz der Klasse "Baum". Aber irgendwie können die beiden noch nicht wirklich viel tun, was fehlt, sind Methoden (engl. Method). Fragt Foo also Bar nach seinem Wohlbefinden, ruft er eine Methode von Bar auf, und Bar muss zurückliefern, wie gesund er ist.

Im Laufe des Kapitels OOP in PHP werden wir immer wieder auf das Beispiel mit dem Baum zurückkommen. Hier mal eine kleine Aussicht, wie unsere Klasse später aussehen wird:

Hinweis

Dieses und alle folgenden Beispiele funktionieren erst ab PHP-Version 5. Die Vorgängerversion PHP 4 bietet zwar auch Objektorientierung, kennt aber viele der vorgestellten Möglichkeiten, wie Sichtbarkeit, Interfaces oder automatische Übergabe von Objekten als Referenz nicht.
  <?php
  
  class Baum {
    protected $gesundheit = 100; // bei 0 ist unser Baum ein Tisch
    protected $hoehe;      // die Höhe des Baumes
  
    public function sage_mir_dein_wohlbefinden() {
      if ( $this->gesundheit > 80 ) return 'Mir geht es super.';
      if ( $this->gesundheit > 40 ) return 'Ich hatte schon bessere Tage.';
      if ( $this->gesundheit > 0 )  return 'Mir geht es echt mies.';
      return 'Ich bin ein Tisch.';                   /*  tritt nur ein wenn $this->gesundheit
                                                      *  kleiner oder gleich 0 ist. */
    }
  
    public function wie_hoch_bist_du() {
      return 'Ich bin ' . $this->getHoehe() . ' Meter hoch.';
    }
  
    public function wachse($summand) {
      $this->setHoehe($this->getHoehe() + $summand); /* eigentlich müsste man überprüfen, ob 
                                                      * $summand es überhaupt wert ist, addiert
                                                      * zu werden, also ob er ein Zahlwert ist,
                                                      * oder nicht. Für den Moment soll uns aber
                                                      * dieser kurze Code genügen.*/
    }
  
    public function setGesundheit($neueGesundheit) {
      $this->gesundheit = $neueGesundheit;
    }
  
    public function getHoehe() {
      return $this->hoehe;
    }
    
    protected function setHoehe($neueHoehe) {
      $this->hoehe = $neueHoehe;
    }
  
  } // Ende von Klasse Baum
  
  $Bar = new Baum(); // Neues Objekt der Klasse Baum erzeugen
  $Bar->setGesundheit(75);
  $Bar->wachse(5);
  echo $Bar->wie_hoch_bist_du() . ' ';
  $Bar->wachse(10);
  echo $Bar->sage_mir_dein_wohlbefinden() . ' ' . $Bar->wie_hoch_bist_du();
  
  ?>

Dieser Code erzeugt folgende Ausgabe:

Ich bin 5 Meter hoch. Ich hatte schon bessere Tage. Ich bin 15 Meter hoch.

Man sollte bemerken, dass jeder Zugriff auf Eigenschaften nur durch Methoden erfolgt. Man könnte sie zwar auch von außen ändern (in diesem speziellen Fall allerdings nicht) und wir werden auch noch lernen wie, aber es gibt gute Gründe, sogenannte Setter- und Getter-Methoden zu implementieren.

Der Baum kann sprechen Bearbeiten

Der Code eben ist natürlich bei weitem noch nicht vollständig, man müsste noch eine Methode zum Aufnehmen von Regen etc. hinzufügen; auch bleibt unser Baum, so wie er jetzt ist, ewiglich gesund. Da unser Held Foo aber alle Bäume in einem winzigen Wald befragen möchte, brauchen wir noch einige andere Bäume. Auch sollten nicht alle gleich ganz gesund sein.

Der Konstruktor Bearbeiten

Ein Konstruktor ist die Funktion, die beim Erzeugen eines Objekts aufgerufen wird, sie heißt __construct() (Der doppelte Unterstrich weist auf eine Magische Methode hin.) In PHP 4 wurde stattdessen der Name der Klasse verwendet.

  <?php
  
  class Baum {
    protected $gesundheit; // bei 0 ist unser Baum ein Tisch
    protected $hoehe;      // Höhe des Baumes
  
    public function __construct($gesundheit = 100, $hoehe = 0) {
      $this->setGesundheit($gesundheit);
      $this->setHoehe($hoehe);
    }

   // Vorheriger Code

  } //- Ende der Klasse Baum
  
  echo 'Bar: ';
  $Bar = new Baum(100,0);
  $Bar->wachse(5);
  echo $Bar->wie_hoch_bist_du() . ' ';
  $Bar->wachse(10);
  echo $Bar->sage_mir_dein_wohlbefinden() . ' ' . $Bar->wie_hoch_bist_du();
  echo "\nBor: ";
  $Bor = new Baum(10,24);
  echo $Bor->sage_mir_dein_wohlbefinden() . ' ' . $Bor->wie_hoch_bist_du();
  echo "\nBer: ";
  $Ber = new Baum(0,1);
  echo $Ber->sage_mir_dein_wohlbefinden() . ' ' . $Ber->wie_hoch_bist_du();
  
  ?>

Das erzeugt folgende Ausgabe:

Bar: Ich bin 5 Meter hoch. Mir geht es super. Ich bin 15 Meter hoch.
Bor: Mir geht es echt mies. Ich bin 24 Meter hoch.
Ber: Ich bin ein Tisch. Ich bin 1 Meter hoch.

Foo hat also zwei Bäume und einen Tisch interviewt.