Johannes Zeller: Kennst sich jemand mit php UND Java aus ? " this ?

Beitrag lesen

Hallo Klaus

Nein. Nur kannst du ihn in der Regel weglassen.

Aber in php nicht?

Nein.

In Java sind die beiden Schreibweisen this.methode() und methode() gleichwertig. Normalerweise benötigst du this nur, wenn du in einer Methode eine Instanz- oder Klassenvariable überlagerst.

Was war noch mal der Underschied zwischen den beiden?

Eine Instanzvariable gilt nur für das aktuelle Objekt während eine Klassenvariable in allen Objekten einer Klasse denselben Wert hat.

Also kommt in Java this nur im Konstruktor vor?

Oder in anderen Methoden, in denen es nötig ist, eine Instanz-/Klassenvariable zu verwenden, die durch eine lokale Variable gleichen Namens verdeckt wird.

Beispielklasse:

class Tisch
{
    $tischdecke;
    $farbe;

Fehlen hier nicht zwei 'var'?

Tisch($tischdecke)
    {
        $this->tischdecke = $tischdecke;
    }

function setTischfarbe($farbe)
    {
        $this.tischfarbe = $farbe;

Tippfehler, es müsste $this->tischfarbe heißen.

}

function returnTischfarbe
    {
        return $this->tischfarbe;
    }
}

Also mein Verständnis war immer dass ich, wenn ich setTischfarbe aufrufe, $this.tischfarbe = $farbe; schreibe, um $farbe (Attribut der Klasse) zu setzen. Wenn ich das $this in der Methode setTischfrabe weglasse, kann die Methode returnTischfarbe ja nix zurückgeben, wenn ich sie aufrufe. Sehe ich das so richtig?

Ja. in setTischfarbe hast du eigentlich zwei Variablen mit dem Namen Farbe. Einmal die lokale Variable, in der das Argument der Funktion gespeichert ist und die Instanzvariable. Mit $this->farbe sagst du dem PHP-Interpreter, dass er die Instanzvariable nehmen soll, ansonsten verwendet er die lokale Variable.

In PHP müssen lokale Variablen nicht explizit deklariert werden, sondern werden automatisch beim ersten Gebrauch erzeugt. Deshalb kann man das $this nicht weglassen, denn dann würde stattdessen eine lokale Variable mit gleichem Namen erzeugt werden.

Wie sähe diese Klasse in Java aus?

public class Tisch
{
    Tischdecke tischdecke;
    Tischfarbe tischfarbe;

public Tisch(Tischdecke tischdecke)
    {
        this.tischdecke = tischdecke;
    }

public void setTischfarbe(Tischfarbe tischfarbe)
    {
        this.tischfarbe = tischdecke;
    }

public Tischfarbe getTischfarbe()
    {
        return this.tischfarbe; // Das 'this.' ist optional
    }
}

tischfarbe und tischdecke sind in diesem Beispiel Instanzen der Klassen Tischfarbe und Tischdecke.

Schönen Abend noch,

Johannes

--
ss:| zu:} ls:[ fo:} de:] va:} ch:° sh:( n4:| rl:( br:^ js:| ie:{ fl:( mo:}