# Auf Variable einer Elternklasse zugreifen



## ficher (31. Dezember 2007)

Hallo,

ich möchte auf eine Variable (keine Konstante) einer Elternvariable zugreifen.
Schaut euch einfach mal den Code an. Der sagt eigentlich schon alles!


```
class lang {
    public $lang;
    public $lang_var;
    
    public function __construct($lang, $default) {
        if(file_exists('lang/'.$lang.'.lang.php') == true) $this->lang = $lang;
        else $this->lang = $default;
        include('lang/'.$this->lang.'.lang.php');
        $this->lang_var = $text;
    }

    public function get_lang_var() {
        return $this->lang_var;
    }
}

class db extends lang {
    public function error($err, $file, $line) {
        $lang_var = parent::get_lang_var();
                ...
    }

}
```
Das scheint irgendwie ein Problem mit $this in der Funktion get_lang_var zu sein... Muss ich da etwas anderes als $this schreiben, weil ich aus einer anderen Klasse dadrauf zugreife?
Was mache ich falsch?

PS: Noch besser wäre es eigentlich, wenn ich einfach auf die Variable $lang_var der Klasse lang direkt zugreifen könnte ohne eine neue Funktion erstellen zu müssen. Geht das auch?


----------



## maeTimmae (31. Dezember 2007)

Folgendes Beispiel zeigt in etwa, wie es funktioniert:

```
<?php

class A {
    protected $var  = null;
    private   $var2 = null;

    public function __construct() {
        $this->var  = 'A';
        $this->var2 = "private";
    }

    public function getVar() {
        return $this->var;
    }

    public function getVar2() {
        return $this->var2;
    }
}

class B extends A {
    public function __construct() {
        $this->var = 'B';
    }
}

$a = new A();
$b = new B();

var_dump(
        $a->getVar(),   // A
        $a->getVar2(),  // private
        $b->getVar(),   // B
        $b->getVar2()   // NULL, da im Parent als privat property deklariert
    );
```

In B wird die Eigenschaft nicht überschrieben sondern aus A implementiert, dennoch ist es eine eigene Eigenschaft von B, womit über $this zugegriffen werden kann. Hoffe, das Beispiel bringt das nahe. $var2 hingegen ist im Parent als private Eigenschaft deklariert, kann also nicht vererbt werden, wie die Rückgabe von $b->getVar2() zeigt. Via parent werden lediglich statische Variablen einer Elternklasse, Konstanten einer Elternklasse oder Methoden einer Elternklasse aufgerufen, nicht aber dynamische Eigenschaften. Das alles gilt natürlich nur für überschriebene Methoden und Eigenschaften.



ficher hat gesagt.:


> Das scheint irgendwie ein Problem mit $this in der Funktion get_lang_var zu sein... Muss ich da etwas anderes als $this schreiben, weil ich aus einer anderen Klasse dadrauf zugreife?


Genau $this muss hin, die Eigenschaft darf natürlich nicht überschrieben werden.



ficher hat gesagt.:


> PS: Noch besser wäre es eigentlich, wenn ich einfach auf die Variable $lang_var der Klasse lang direkt zugreifen könnte ohne eine neue Funktion erstellen zu müssen. Geht das auch?


Siehe Klasse B im Beispiel - Sollte so weit eigentlich sich selbst erklären können. Variable in Elternklasse auf protected oder public Scope stellen und in der abgeleiteten Klasse nicht überschreiben und möglichst zuerst über den Eltern-Konstruktor initialisieren:

```
<?php

class B extends A {
    public function __construct() {
        parent::__construct();
        // sonstige Initialisierungen...
    }
}
```

Eventuell liegt es an meiner Verfassung zur Zeit, dass es sich so schwer erklären lässt. aber ich hoffe, du verstehst was ich meine


----------



## ficher (1. Januar 2008)

Hab es jetzt gelöst! Danke!


----------

