php Logo

Paul Ferd. Siegert Datenbankgestützte Webseiten

 
Objektorientierte Programmierung (OOP)



Anders als in der prozeduralen Programmierung werden bei der objektorientierten Programmierung (OOP) Daten und die dazugehšrigen Funktionen zusammengefasst. Bei der OOP spricht man dann on Eigenschaften und Methoden, die gemeinsam ein Objekt bilden.

Die Objekte werden abstrakt definiert. Es wird also eine Art Prototyp für ein Objekt angelegt, dass Klasse genannt wird.

            KLASSE Fahrzeug
            --------------------------------
            | EIGENSCHAFT Geschwindigkeit  |
            --------------------------------
            |                              |
            | METHODE beschleunigen()      |
            |                              |
            |                              |
            |                              |
            |                              |
            |                              |
            --------------------------------


Der Code sieht das dann so aus:
class Fahrzeug {
	var $geschwindigkeit;
	
	function beschleunigen() {
		...
	}
}


Um diese Klasse verwenden zu können muss eine Kopie der abstrakten Klassendefinition - in der OOP Terminologie eine Instanz - gebildet werden, die dann mit konkreten Daten belegt wird.
KLASSE Fahrzeug                         INSTANZ meinAuto
--------------------------------        --------------------------------
| EIGENSCHAFT geschwindigkeit  |        | EIGENSCHAFT 50 Km/h          |
--------------------------------        --------------------------------
|                              |        |                              |  
| METHODE beschleunigen()      |        | METHODE beschleunigen()      |
|                              | ==>>   |                              |
|                              |        |                              |
|                              |        |                              |
|                              |        |                              |
|                              |        |                              |
--------------------------------        --------------------------------
Es können beliebig viele Insatnzen einer Klasse gebildet werden. Die Klasse bleibt davon unberührt. Um die Instanzen unterscheiden und mit ihnen arbeiten zu können werden Sie durch einen Handler (Variable) repräsaentiert.

Im Programm sieht das dann so aus:
$meinAuto = new Fahrzeug();
Der Handler "meinAuto" repräsentiert nun die konkrete Instanz der Klasse Fahrzeug.
Über diesen Handler können nun die Eigenschaften der Instanz gelesen und belegt, sowie deren methoden aufgerufen werden.
$meinAuto->beschleunigen();
echo $meinAuto.geschwindigkeit;
Bei der Idee der Objektorientierung versucht man also Datenstrukturen zu bilden, in denen Daten und die auf sie zugreifenden Funktionen in einem Objekt gekapselt sind. Die Funktionen haben ausschließlich Auswirkungen auf die Daten im eigenen Objekt, so dass Seiteneffekte auf andere Programmteile nicht möglich sind. Das ermöglicht eine modulare und übersichtliche Programmierung. Man kann so fremnde Objekte als blackbox nutzen, ohne zu wissen wie ein Objekt seine Aufgabe erfüllt.

Innerhalb eines Objektes greifen die Methoden mit "this->" auf die Klassen-Variablen und -Methoden zu.
class Fahrzeug {
	var $geschwindigkeit;
	
	function beschleunigen() {
		$this->geschwindigkeit++;
		...
	}
	
	function ueberholen() {
		$this->beschleunigen();
		...
	}
}

Vererbung

Es ist möglich eine Klassenhierarchie aufzubauen, d.h. das eine Klasse (Laster) eine bereits bestehende (Fahrzeug) erweitert. Die Klasse Laster erbt dann alle Eigenschaften und Methoden der Eltern-Klasse (Parent-Klasse). Die Methoden der Paraentklasse können auch überschrieben werden.
class Laster extends Fahrzeug{
	var $ladegewicht;
	
	function anfahren() {
		partent::beschleunigen();
		...
	}

}

Kapselung

Eigenschaften und Methoden von Klassen können versteckt werden. Dafür gibt es drei Schlüsselwörter:
  • public - Auf diese Variable oder Methode kann von überall her zugegriffen werden.
  • protected - Nur der Zugriff Ÿber eine vererbte Klasse ist möglich
  • private - Auf diese Variable oder Methode kann nur innerhalb der Klasse zugegriffen werden.
Mit der Kapselung von Objekten können eindeutige Schnittstellen geschaffen werden, ohne dass bei einer Veränderung der Klasse andere, die Klasse nutzende Programme in Mitleidenschaft gezogen werden.
class Laster extends Fahrzeug {
	public $ladegewicht;
	
	public function anfahren() {
		partent::beschleunigen();
		...
	}

}
Ohne Defilition einer der drei Begriffe, sind die Methoden und Eigenschaften immer public.

Statische Methoden oder Attribute sind an die Klasse, nicht an die Instanz der Klasse gebunden. Diese dürfen nicht mit $this-> aufgeruden werden sondern nur über Classenname::Methode()
class Mitarbeiter {
	public static $mitarbeiterid = 0;
	public $id;
	public Vorname;
	public nachname;
	
	public function _construc() {
		$this->id = $mitarbeiterid++;
		...
	}

}

Sondermethoden

  • _connstruct() Diese Methode einer Klasse wird immer dann automatisch aufgerufen, wenn eine neue Instanz erzeugt wird.
  • _destruct() Diese Methode wird immer aufgerufen bevor eine Instanz zerstört wird. (z.B. Schließen der Datenbank etc.)
  • _clone() Diese Methode müssen sie benutzen um Instanzen zu kopieren.