Skip to content

Das Konzept Tasse vs. Tassen auf dem Tisch

Ich wurde gerade per EMail gefragt, was bei PHP der Unterschied ist, wenn man Klassenmethoden per Klasse::methode() oder $EineInstanz->methode() aufruft. Das ist eigentlich die Frage danach, was in OOP Klassen und was Instanzen sind. Hier mal meine bildliche Antwort dazu, vielleicht bringt es auch anderen einen Erkenntnisgewinn:

Stell Dir "Tassen" vor. Es gibt das "Konzept Tasse": Eine Tasse ist ein Behälter, der (normaler Weise) Flüssigkeit aufnimmt, der immer einen Henkel hat, den man füllen kann und aus dem man trinken kann.

Dieses "Konzept" ist im übertragenen Sinne eine "Klasse". Und so könnte das "Konzept Tasse" aussehen:

class Tasse {
    var $fluessigkeit;
    public Tasse($befuellung) {
        $this->fluessigkeit = $befuellung;
    }
    static function anzahlHenkel() {
        // Tassen haben immer einen Henkel
        return 1;
    }
    function trinken() {
        return $this->fluessigkeit;
    }
}

Nun gibt es mehrere "Instanzen" von Tassen. 3 Tassen, die auf Deinem Tisch stehen. In der einen Tasse ist Kaffee, in der anderen Schlafmittel und in der dritten Putzmittel. Alle haben einen Henkel und aus allen kann man trinken. Sie sind also alle vom "Konzept Tasse", aber eben reale Instanzen mit unterschiedlicher Konfiguration (anderer Füllung). Das Resultat, wenn Du aus einer Instanz der Tassen auf dem Tisch trinkst, ist also deutlich unterschiedlich, abhängig davon, aus welcher Tasse Du trinkst..

Diese Instanzen sind in OOP "Objekte" einer Klasse. In PHP (und OOP allgemein) müssen diese per new instanziiert werden und werden dann intern über $this->methode benutzt.

Bei der Tasse funktioniert das also so:

$tasse = new Tasse('Kaffee');
$fluessigkeit = $tasse->trinken();
// Resultat: leckerer Kaffee!
// (nämlich $this->fluessigkeit, also die Füllung einer speziellen Tasse)

Du rufst aber folgendes auf:

$fluessigkeit = Tasse:trinken();
// Resultat in echten OOP Sprachen ein Fehler, in PHP halt NULL
// Intern wird hier auf $this->fluessigkeit zugegriffen.
// $this ist aber eben eine Instanz und im Klassenkonzept natürlich nicht definiert.

Tasse::trinken beschreibt nur, dass Du, wenn Du aus einer Tasse etwas trinkst, die Flüssigkeit bekommst, die vorher in die jeweilige Tasse gefüllt wurde. Es ist also das Konzept "aus einer Tasse trinken", Du trinkst hier nicht real aus einer Tasse. Der Aufruf der Methode auf diese Weise ist also unsinnig (in echtem OOP geht das gar nicht, bei PHP passiert da undefiniertes).

Wenn allerdings die Allgemeingültigkeit für eine Klassenmethode gilt, dann beschreibt man sie als "static" (also Instanz unabhängig):

$zahl= Tasse::anzahlHenkel(); 

geht, weil das "Konzept Tasse" immer genau einen Henkel (unabhängig von der tatsächlichen Instanz) vorsieht. Genauer: Hier fragst Du nicht danach, wie viele Henkel eine spezielle Tasse hat, sondern wie viele Henkel Tassen im allgemeinen haben.

Faustregel: Wenn Du Dir den Bauplan einer Tasse ansehen willst, dann kannst Du Tasse::methode() aufrufen. Wenn Du aber mit realen Tassen hantieren möchtest, dann muss $realeTasse->methode() verwendet werden.

.. oder noch mehr auf PHP bezogen: Eine Klassenmethode, die $this verwendet, darf nie als Klasse::methode() aufgerufen werden, sondern muss immer als $instanz->methode() aufgerufen werden. Innerhalb dieses Methodenaufrufs ist $this dann nämlich die Variable $instanz. Beim Aufruf Klasse::methode() ist $this dagegen undefiniert.

Trackbacks

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Noch keine Kommentare

Kommentar schreiben

Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Dieses Blog erlaubt Dir, Audio Kommentare über audioboo.fm hinzuzufügen. Erstelle einen neuen Boo und gib hier den Link auf die Seite Deines Boos ein.
record
Wenn Du Deinen Twitter Namen eingibst wird Deine Timeline in Deinem Kommentar verlinkt.
Bewirb einen Deiner letzten Artikel
Dieses Blog erlaubt Dir mit Deinem Kommentar einen Deiner letzten Artikel zu bewerben. Bitte gib Deine Blog URL als Homepage ein, dann wird eine Auswahl erscheinen, in der Du einen Artikel auswählen kannst. (Javascript erforderlich)
(Bedingung: 1 Kommentare geschrieben)
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
tweetbackcheck