(letzte Änderung an dieser Seite: 15.05.2011)
(letzte Synchronisation der PDF-Präsentation: 02.08.2017)
Falls keine PDF-Präsentation zu sehen ist, klicken Sie zum Download hier: Direktdownload PDF-Präsentation
Klassen können Oberklassen/Basisklassen (Eltern) und Unterklassen (Kinder) haben. Ein Kind erbt alles (Attribute, Methoden) von den Eltern, sofern es innerhalb der Kind-Klasse nicht anders definiert wurde. Um eine Klasse als Unterklasse einer anderen zu definieren, benutzt man extends
.
Wir einigen uns auf folgende Terminologie:
Basisklasse (synonym zu Oberklasse, Superklasse, Elternklasse)
Unterklasse (synonym zu Subklasse, Kindklasse)
PHP-Codeclass Tier { public $hungrig = 'Ich habe Hunger.'; function fressen($nahrung) { $this->hungrig = 'Ich habe keinen so großen Hunger.'; } } class Hund extends Tier { function fressen($nahrung) { if($nahrung == 'Knochen') { $this->hungrig = 'Jetzt bin ich schön satt.'; } else { echo 'Wuff wuff, ich mag nur Knochen!!'; } } }
Die Methode fressen
wird durch die Unterklasse überschrieben, da der Hund nur Knochen mag. Der anfängliche Zustand von “hungrig” bleibt bestehen und kann deshalb von der Basisklasse “Tier” geerbt werden.
Das Funktionieren können wir überprüfen, indem wir den Hund mit Knochen oder etwas anderem füttern:
PHP-Code// $hund mit einem Salatkopf füttern echo "<em>Der Hund bekommt jetzt einen Salatkopf.</em><br />"; $hund->fressen('Salatkopf'); echo $hund->hungrig; // $hund mit einem Knochen füttern echo "<em>Der Hund bekommt jetzt einen Knochen.</em><br />"; $hund->fressen('Knochen'); echo $hund->hungrig;
PHP-Codeclass Tier { public $hungrig = 'Ich habe Hunger.<br />'; function eat($food) { $this->hungrig = 'Ich habe keinen so großen Hunger.<br />'; } } class Hund extends Tier { function fressen($nahrung) { if($nahrung == 'Knochen') { $this->hungrig = 'Jetzt bin ich schön satt.<br />'; } else { echo 'Wuff wuff, ich mag nur Knochen!! Gib mir etwas anderes!<br />'; } } } // Objekt $hund instanziieren $hund = new Hund; // Anfangszustand des Objekts ausgeben echo $hund->hungrig; // $hund mit einem Salatkopf füttern echo "<em>Der Hund bekommt jetzt einen Salatkopf.</em><br />"; $hund->fressen('Salatkopf'); echo $hund->hungrig; // $hund mit einem Knochen füttern echo "<em>Der Hund bekommt jetzt einen Knochen.</em><br />"; $hund->fressen('Knochen'); echo $hund->hungrig;
Offizielle Bezeichnung (auch in Fehlermeldungen): “Paamayim Nekudotayim” (hebräisch für “doppelter Doppelpunkt”), wird auch als “Gültigkeitsoperator” bezeichnet.
Der Scope Resolution Operator erlaubt es, auf statische Eigenschaften und Methoden zuzugreifen.
Wenn ein Objekt instanziiert wird, werden u.U. Methoden oder Attribute der Basisklasse überschrieben (im Beispiel im Artikel fressen
der Basisklasse Tier überschrieben durch die Methode fressen
der Unterklasse Hund). Die überschriebene Methode kann aber aus dem Objekt heraus aufgerufen und benutzt werden. Dazu benutzt man Klasse::methode();
bzw. parent::methode();
:
PHP-Code// Basisklasse: Tier class Tier { // Attribut $hungrig = Anfangszustand der Klasse Tier public $hungrig = 'Ich habe Hunger.<br />'; // Konstruktor: Wird bei der Instanziierung eines (Unter-)Objekts der Klasse Tier aufgerufen function __construct() { echo "Ich bin ein Tier.<br />"; } // Methode fressen, gilt für alle Objekte der Klasse Tier: Was immer ein Tier frisst, danach ist es satt. function fressen($nahrung) { $this->hungrig = 'Ich habe keinen Hunger.<br />'; } } // Unterklasse: Hund class Hund extends Tier { public $rasse; // Konstruktor: Wird bei der Instanziierung eines Objekts $hund aufgerufen - Rasse muss bestimmt werden, d.h.: Jeder Hund hat zwangsläufig eine Rasse. Dieser Konstruktor überschreibt den Konstruktor der Klasse Tier. function __construct($rasse) { $this->rasse = $rasse; // Da der Konstruktor der Klasse Tier durch den Konstruktor der Klasse Hund überschrieben wurde, müssen wir ihn explizit aufrufen: Tier:: __construct(); } // Die Klasse Hund definiert eine Methode 'fressen' und überschreibt damit die Methode 'fressen' der Basisklasse Tier ... function fressen($nahrung) { if($nahrung == 'Knochen') { // ... trotzdem kann der Hund die überschriebene Methode fressen der Basisklasse Tier verwenden Tier::fressen($nahrung); // Möglich ist auch die pauschale Verwendung von parent::fressen($nahrung); - hier wird automatisch die Basisklasse ("Elternklasse") verwendet. } else { echo 'Wuff wuff, ich mag nur Knochen!! Gib mir etwas anderes!<br />'; } } } // Objekt $hund instanziieren $hund = new Hund('Mops'); // Anfangszustand des Objekts ausgeben echo $hund->hungrig; // $hund mit einem Salatkopf füttern echo "<em>Der Hund bekommt jetzt einen Salatkopf.</em><br />"; $hund->fressen('Salatkopf'); echo $hund->hungrig; // $hund mit einem Knochen füttern echo "<em>Der Hund bekommt jetzt einen Knochen.</em><br />"; $hund->fressen('Knochen'); echo $hund->hungrig; // Kontrollieren: Konstruktor der Unterklasse Hund echo "<br /><br />"; $hundsrasse = $hund->rasse; echo $hundsrasse;
Wenn man eine statische Methode von außerhalb des Objekts aufrufen will, erhält man eine Fehlermeldung:
PHP-CodeDog::fressen('cookie');
Fatal error: Using $this when not in object context
“Mit dem Schlüsselwort static werden Methoden (ab PHP 5) oder Eigenschaften (ab PHP 4) einer Klasse als statisch deklariert. Statisch heißt, dass diese Methoden oder Eigenschaften verwendet werden können, ohne dass ein Objekt aus der Klasse erzeugt wurde.” (php-bar.de – static)Sie werden mit dem Scope Resolution Operator aufgerufen.
PHP-Codeclass Hund { static $hungrig = 'Ich bin hungrig.'; static function fressen($nahrung) { if($nahrung == 'Knochen') { self::$hungrig = 'Ich bin satt.'; } else { echo 'Wuff, wuff, ich möchte nur Knochen.'; } } } Hund::fressen('Knochen'); echo Hund::$hungrig;
self::$hungrig lässt sich auch ausdrücken durch Hund::$hungrig
Werden die Variablen und Methoden hier nicht als static deklariert, dann funktioniert der Scope Resolution Operator nicht, und der $hund muss als Objekt instanziiert werden:
PHP-Codeclass Hund { function fressen($nahrung) { if($nahrung == 'Knochen') { $this->hungrig = 'Ich bin satt.'; } else { $this->hungrig = 'Ich möchte lieber einen Knochen'; } } } $hund = new Hund; $hund->fressen('Knochen'); echo $hund->hungrig;
Anderes gutes Beispiel: Scope Resolution Operator bei phpbar.de
Abstrakte Klassen werden nicht instanziiert, sondern dienen nur als Basisklassen für andere Klassen. In abstrakten Klassen können auch abstrakte Methoden definiert werden.
Beispiel:
PHP-Codeabstract class Tier { public $hungrig = 'Ich bin hungrig'; abstract public function fressen($nahrung); } class Hund extends Tier { function fressen($nahrung) { if($nahrung == 'Knochen') { $this->hungrig = 'Bin nicht mehr hungrig.'; } else { echo 'Wuff, wuff, ich will lieber einen Knochen.'; } } } $hund = new Hund; $hund->fressen('Salat'); echo $hund->hungrig;
PHP-Code$manager1 = new Manager; $name = 'huber'; $personalnummer = $manager1->getPersonalnummer($name); echo "<p>Mitarbeiter " . $name . " hat Personalnummer " . $personalnummer . "</p>\n";
MySQL-CodeCREATE TABLE `mitarbeiter` ( `id` INT NOT NULL , `nachname` VARCHAR(45) NULL , `personalnummer` INT NULL , PRIMARY KEY (`id`) ); INSERT INTO `mitarbeiter` (`id`, `nachname`, `personalnummer`) VALUES ('1', 'huber', '17312214'); INSERT INTO `mitarbeiter` (`id`, `nachname`, `personalnummer`) VALUES ('2', 'maier', '31553212'); INSERT INTO `mitarbeiter` (`id`, `nachname`, `personalnummer`) VALUES ('3', 'zuckerberg', '48818828');