PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variablen in anderer Klasse auslesen


rAbe
30.11.2007, 19:05:42
Hi all,

Ich stecke seit längerem fest und habe auch bei Freund Google und ähnlichem (Manual, Kumpels etc.) keine Lösung gefunden. Nun wende ich mich vertrauensvoll an euch.

Problem:
Ich habe 2 Klassen A und B (B extends A)

A hat ein paar public-variablen (zB Name) auf die ich von B aus zugreifen will.

Ich habe mit diesen Befehlen versucht:
echo $A->Name;
// oder mit:
echo $this->Name;

Soweit ich meine Quellen verstanden habe, müsste das eigentlich gehen. Tuts aber nicht bei mir.

Könnt ihr mir sagen, wie ich aus B auf Variablen in A zugreifen kann?

Danke im Voraus und Gruss
rAbe

meikel (†)
30.11.2007, 22:12:06
A hat ein paar public-variablen (zB Name) auf die ich von B aus zugreifen will.

Ich habe mit diesen Befehlen versucht:
echo $A->Name;
// oder mit:
echo $this->Name;
1. $A->Name geht nur dann, wenn $A innerhalb des aktuellen Variablenraumes bekannt ist.
2. $this->Name geht nur dann, wenn der Konstruktor der Kind-Klasse den Konstruktor der Elternklasse oder eine dementsprechende "Eltern" Methode aufgerufen hat.

Tippfehler beseitigt.

feuervogel
01.12.2007, 09:45:55
Könnt ihr mir sagen, wie ich aus B auf Variablen in A zugreifen kann?


Da ich grade schreibfaul bin: Mit dieser Fülle an Informationen nicht.

rambi
01.12.2007, 12:24:08
echo $this->Name; <<<-- so!

Socrates
01.12.2007, 22:19:22
Abend!
Wie Rabe schon geschrieben hat, gehtecho $this->Name;nicht. Jedoch könnte ich mir vorstellen, dass folgendes Geht.echo A::$Name;So wüsste die Klasse B, dass du auf eine Variable $Name aus der Klasse A zurückgreifst. Diese Methode ermöglicht zum beispiel auch, dass in Klasse A und B gleich benannte Funktionen nicht beide auf einaml Aufgerufen werden.echo A::show();
echo B::show();Gibt demnach eine unterschiedliche Ausgabe.
MfG, Andy

rambi
01.12.2007, 22:50:51
Quark!!
Du verwendest statische Aufrufe!
Warum?

Und echo $this->Name; tuts sehr wohl IN einer Insatanz von B, welche die Eigenschaft Name von A erbt.

Nochmal lesen bitte:

Ich habe 2 Klassen A und B (B extends A)
A hat ein paar public-variablen (zB Name) auf die ich von B aus zugreifen will.

Beweis:
<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);

class a
{
public $Name = "Willi Wuchtig";
}

class b extends a
{
public function zeige_es()
{
echo $this->Name;
}
}


// testcode
$instance = new b;
$instance->zeige_es();
?>

Socrates
01.12.2007, 23:12:19
Diese Lösung geht selbstverständlich. Und du hast recht meine Version sind statische Aufrufe, also tatsächlich keine gute Lösung. Jedoch könnte Rabe mit seiner Behauptung, dass es nicht geht dennoch Recht haben, wenn er die Variabeln nicht, wie du es getan hast, bei der Initialisierung gleich setzt. Also sie nur Initialisiert und erst im Constructur oder in einer Methode definiert.<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);

class a
{
public $Name;

__construct()
{
$this->Name = "Willi Wuchtig"
}
}

class b extends a
{
public function zeige_es()
{
echo $this->Name;
}
}


// testcode
$instance = new b;
$instance->zeige_es();
?> Geht nicht! Wenn dies gehen soll, muss wie meikel schon richtig sagte der Constructor von a aufgerufen werden.
MfG, Andy

rambi
01.12.2007, 23:17:42
Das geht für mich alles nicht aus der Frage hervor!
<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);

class a
{
public $Name = "Rhababerkuchen";
}

class b extends a
{
public function zeige_es()
{
echo $this->Name;
}
public function setze_es($name)
{
$this->Name = $name;
}
}


// testcode
$instance = new b;
$instance->setze_es("Willi Wuchtig");
$instance->zeige_es();
?>

Socrates
02.12.2007, 09:58:35
In deinem Beispiel gibt es jetzt nur ein Problem. In Klasse a ist $this->Name = "Rhababerkuchen". So wird es auch in die Klasse b übernommen. Mit der Methode setze_es() überschreibst du jedoch die Variable aus a. In deiner Instanz machst du das mit "Willi Wuchtig". Aber genau das soll ja meistens nicht passieren und deshalb ist meine statische Variante ja doch nicht ganz dumm, denn es kann immer zu doppelten Benennungen kommen. Typische Namen für Methoden sind ja oft show(), out(), run(), etc. Solche doppelten Benennungen rufen oft fatale Fehler hervor.
MfG, Andy

rambi
02.12.2007, 10:22:43
Mit der Methode setze_es() überschreibst du jedoch die Variable aus a.
Und, wo ist das Problem?
Nochmal lesen bitte, aber dieses mal richtig:
Ich habe 2 Klassen A und B (B extends A)
A hat ein paar public-variablen (zB Name) auf die ich von B aus zugreifen will.
Es soll die Eigenschaft aus a genutzt werden!!!!

--------------

und deshalb ist meine statische Variante ja doch nicht ganz dumm
Doch!
Statische Objekteigenschaften stören die Vererbungskette... Wie alle einschränkenden Sprachmittel, sollte man sie nur in ganz wenigen ausgewählten Fällen nutzen.

Typische Namen für Methoden sind ja oft show(), out(), run(), etc. Solche doppelten Benennungen rufen oft fatale Fehler hervor.
Quark!
Was du meinst, nennt sich überschreiben (overwrite).
Welches bei Eigenschaften nicht geht, ist mit Methoden problemlos möglich!







Weiterhin gilt:

Das geht für mich alles nicht aus der Frage hervor!

<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);

class a
{
private $Name = "Rhababerkuchen";

protected function get_Name()
{
return $this->Name;
}

public function setze_es($name)
{
$this->Name = $name;
}
}

class b extends a
{
public function zeige_es()
{
echo $this->get_Name();
}

public function setze_es($name)
{
parent::setze_es("Der Name ist: ".$name);
}
}


// testcode
$instance = new b;
$instance->setze_es("Willi Wuchtig");
$instance->zeige_es();
?>

rAbe
02.12.2007, 11:28:27
Hallo zusammen.

Danke für die vielzähligen Antworten. Leider ist das ganze nicht wirklich, was ich mir vorgestellt hab.

Ich möchte ohne Funktionen, also DIREKT, auf die Variablen von Klasse A zugreifen können.
Also etwa so:


if ($A->blabla == $B->blub)
{
// mach was
}


Geht das so irgendwie? Die Klasse A ist eben schon instanziert, bevor ich B instanziere und das kann ich aufgrund des Codes auch nicht ändern.

PS: Das mit $A::blabla hab ich auch probiert. Funktionierte auch nicht.

Danke
und schönes Wochenende
Gruss
rAbe

rambi
02.12.2007, 11:43:36
Ich verstehe dich nicht!!
Einmal spricht du von extends, dann über Instanzen von a und b ???
Bahnhof! Keine Ahnung, welchen Fehler du da begehst....

<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);

class a
{
public $Name = "Rhababerkuchen";
}

class b extends a
{
}

// testcode
$a = new a;
$b = new b;
$a->Name = "Willi";
$b->Name = "Bernd";

if ($a->Name == $b->Name)
{
echo 'ist gleich';
}else
{
echo 'ist ungleich';
}
?>

rAbe
02.12.2007, 12:07:13
Die if-Abfrage muss aber IN der Klasse erfolgen

Also


class A {
public Name = "blub";
}

$A = new A();

class B extends A {
public Name = "bla";
function __construct () {
if ($this->Name == $A->Name) {
echo "ist gleich";
}
else {
echo "ist ungleich";
}
}
}

$B = new B();


$A->Name ist in Klasse B aber immer leer. Muss ich alle Variablen der Klasse A an B übergeben, dass ich auf die zugreifen kann? So entsteht doch ein riesiger Verschleiss an Variablen, die einfach doppelt vorkommen. Und wenn eine Variable in A ändert, muss ich das ganze nochmal übergeben.
So? Ist das verständlich?


Danke für die Geduld :)

Gruss rAbe

rambi
02.12.2007, 12:23:16
So? Ist das verständlich?
Nicht wirklich!!
Ausserdem wirft dein Code Parseerrors ....


Wie Socrates und ich uns schon einig waren:
Statische Eigenschaften können überschrieben werden
Dynamische Eigenschaften können nur die Vorbesetzung und den Gültigkeitsbereich ändern
Schluß aus und vorbei!!
Ansonsten wirst du dir deinen eigenen PHP Interpreter basteln dürfen...

Das ist gegen jede OOP Richtlinie, was du da veranstalten möchtest:
<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);

class A {
public $Name = "blub";
}

$A = new A();

class B extends A {
public $Name = "bla";
function __construct () {
if ($this->Name == $GLOBALS['A']->Name) {
echo "ist gleich";
}
else {
echo "ist ungleich";
}
}
}

$B = new B();

?>

-----------------

Deutlich besser:
<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);

class A {
public $Name = "blub";
}

$A = new A();

class B extends A {
public $Name = "bla";
public function __construct (A $xx) {
if ($this->Name == $xx->Name) {
echo "ist gleich";
}
else {
echo "ist ungleich";
}
}
}

$B = new B($A);
?>