Vererbung und private Variable als Array
frankx
- php
Hellihello
wenn ich in der Basisklasse eine private Variable als Liste definiere und diese über eine Funktion ausgebe funktioniert das erstmal. Wenn ich aber in der erbenden Klasse diese Liste erweitere, spuckt mir die ausgebende Funktion nur die Liste aus der Basisklasse aus. Mache ich das mit einer öffentlichen Variable klappts (code s.u.). Kann mir jemand erklären, warum?
Dank und Gruß,
frankx
class Basis {
private $Liste=array();
public $Liste1=array();
function __construct() {
$this->Liste["Feld1"]="Wert1";
$this->Liste1["Feld1"]="Wert1";
}
function ausgeben(){
return $this->Liste;
}
}
class Erbe extends Basis {
function __construct() {
parent::__construct();
$this->Liste["Feld2"]="Wert2";
$this->Liste1["Feld2"]="Wert2";
}
function erbeausgeben() {
return $this->Liste;
}
}
$basis=new Basis;
$erbe=new Erbe;
echo "\n+++\n";
var_dump($basis->ausgeben());
echo "\n+++\n";
var_dump($erbe->ausgeben());
echo "\n+++\n";
var_dump($erbe->erbeausgeben());
echo "\n+++\n";
var_dump($erbe->Liste1);
Bringt output:
var_dump($basis->ausgeben());
+++
array(1) {
["Feld1"]=>
string(5) "Wert1"
}
var_dump($erbe->ausgeben());
+++
array(1) {
["Feld1"]=>
string(5) "Wert1"
}
obwohl die Liste erweitert wurde
var_dump($erbe->erbeausgeben());
+++
array(1) {
["Feld2"]=>
string(5) "Wert2"
}
bringt nun nur den Teil, der in der erbenden Klasse erweitert wurde (hat "$this" zwei Bedeutungen?)
var_dump($erbe->Liste1);
+++
array(2) {
["Feld1"]=>
string(5) "Wert1"
["Feld2"]=>
string(5) "Wert2"
}
mit der öffentlichen Liste1 gehts...;
hi,
Wenn ich aber in der erbenden Klasse diese Liste erweitere, spuckt mir die ausgebende Funktion nur die Liste aus der Basisklasse aus.
Poste bitte mal, was var_dump nicht nur für die einzelne Objekteigenschaft, sondern für die kompletten Objekte ausgibt.
gruß,
wahsaga
Hellihello wahsaga,
Poste bitte mal, was var_dump nicht nur für die einzelne Objekteigenschaft, sondern für die kompletten Objekte ausgibt.
Wie dedlfix schon erläuterte, taucht in der erbenden Klasse dann die Variable "Liste" zweimal auf...:
object(Basis)#1 (2) {
["Liste:private"]=>
array(1) {
["Feld1"]=>
string(5) "Wert1"
}
["Liste1"]=>
array(1) {
["Feld1"]=>
string(5) "Wert1"
}
}
object(Erbe)#2 (3) {
["Liste:private"]=>
array(1) {
["Feld1"]=>
string(5) "Wert1"
}
["Liste1"]=>
array(2) {
["Feld1"]=>
string(5) "Wert1"
["Feld2"]=>
string(5) "Wert2"
}
["Liste"]=>
array(1) {
["Feld2"]=>
string(5) "Wert2"
}
}
Dank und Gruß,
frankx
hi,
Wie dedlfix schon erläuterte, taucht in der erbenden Klasse dann die Variable "Liste" zweimal auf...:
Hab ich vermutet (war mir aber nicht ganz sicher).
Warum, hat dedlfix ja auch schon erklärt.
gruß,
wahsaga
echo $begrüßung;
wenn ich in der Basisklasse eine private Variable als Liste definiere und diese über eine Funktion ausgebe funktioniert das erstmal.
Ja, denn auf private Elemente kann innerhalb der gleichen Klasse zugegriffen werden.
Wenn ich aber in der erbenden Klasse diese Liste erweitere, spuckt mir die ausgebende Funktion nur die Liste aus der Basisklasse aus.
Erbende Klassen haben keinen Zugriff auf private Mitglieder der Basisklasse.
Was macht PHP, wenn es auf eine Variablennamen trifft, den es (noch) nicht kennt?
Mache ich das mit einer öffentlichen Variable klappts (code s.u.). Kann mir jemand erklären, warum?
Elemente, die public oder protected deklariert wurden, sind in abgeleiteten Klassen verfügbar.
var_dump($erbe->ausgeben());
+++
array(1) {
["Feld1"]=>
string(5) "Wert1"
}
obwohl die Liste erweitert wurde
Sie wurde nicht erweitert. Der $erbe hat eine neue Objekt-Variable namens Liste angelegt, weil er auf die Klassen-Variable (beachte bitte den Unterschied zwischen Klassen- und Objekt-Variable) namens Liste der Basisklasse ja keinen Zugriff hat.
var_dump($erbe->erbeausgeben());
+++
array(1) {
["Feld2"]=>
string(5) "Wert2"
}
bringt nun nur den Teil, der in der erbenden Klasse erweitert wurde (hat "$this" zwei Bedeutungen?)
Bringt nur den Inhalt der Objekt-Variable $erbe->Liste.
Schau dir mal die beiden Objekte $basis und $erbe komplett an: var_dump($basis, $erbe);
Du siehst dann in $erbe Liste zweimal, einmal als private und zum zweiten als public
echo "$verabschiedung $name";