(PHP) Eigenschaften in Kindklasse übernehmen

_linx_

Kleiner Weinapfel
Registriert
04.01.09
Beiträge
1.125
Hab da so ein kleines Problem mit PHP-Klassen:

Code:
<?php
    class Eltern {
        protected $var;
        public function __construct($param) {
            $this->var = $param;
        }
    }
    
    class Kind extends Eltern {
        public function __construct() {
            echo $this->var;
        }
    }
    $Eltern = new Eltern('param...');
    $Kind = new Kind;
?>

Leider kommt da immer NULL als Ergebniss. Ich habe bereits versucht, in Kind das __construct wegzulassen und seperat (als Methode "construct") aufzurufen, aber da vermisst er das Argument für Eltern. Das Problem ist, dass ich nicht immer den Parameter für Eltern noch mitgeben will.

Gibt es da eine Möglichkeit, dass zu umgehen? Ich habe bereits ein existierendes $Eltern. Kann man das irgendwie referenzieren, dass existierende Variablen von $Eltern direkt in $Kind übernommen werden?

edit: Eigentlich müsste ich $Eltern in $Kind klonen und dann die Eigenschaften/Methoden von der Klasse Kind dran hängen. Ist das möglich?

edit2: Für was ist der "Modifikator" =& eigentlich gedacht?
edit 3: =& ist Referenzieren ($a=10; $b =& $a; $a=20; $b==20)
Und für was ist nun &=?
 
Zuletzt bearbeitet:

dakingno1

Cripps Pink
Registriert
31.10.07
Beiträge
149
die Klassenvariable $vaar muss als protected deklariert werden..

Eigentlich müsstest du nen Fehelör bekommen....
 

_linx_

Kleiner Weinapfel
Registriert
04.01.09
Beiträge
1.125
die Klassenvariable $vaar muss als protected deklariert werden..

Eigentlich müsstest du nen Fehelör bekommen....

Sry, mein Fehler. Ist als protected, habs nur falsch geschrieben.

Logisch. Du erzeugst ja auch zwei unterschiedliche Instanzen.

Was genau möchtest du denn erreichen?

Ich möchte, dass ich in der Kindklasse bereits definierte Variablen der Elternklasse auch nutzen kann. Dann kann ich z.B. folgende Ablauf erreichen: Kindklasse 1 <-> Kindklasse 2. Und das ohne dass sich die beiden Kindklassen kennen müssen. Ergibt am Schluss so ne Art Pluginsystem.

Edit: Im Prinzip ist also die Kindklasse ein abgeleiteter Klon der Elternklasse.
 
Zuletzt bearbeitet:

naich

Pomme d'or
Registriert
22.11.08
Beiträge
3.082
Das klingt so, dass das eine Static Variable sein soll?? Also nicht extra für jede Klasse diese Variable, sondern 1 x für die Klasse und alle abgeleiteten Objekte:
public static $my_static = 'foo';

Was soll das bedeuten?:
z.B. folgende Ablauf erreichen: Kindklasse 1 <-> Kindklasse 2.
 

_linx_

Kleiner Weinapfel
Registriert
04.01.09
Beiträge
1.125
Eine statische Variable löst das Problem ja auch nicht. Die kann man nicht mehr verändern…

Die Kindklasse soll gleichzeitig ein Klon der Elternklasse sein und ihre eigenen Methoden einbringen können.
 

naich

Pomme d'or
Registriert
22.11.08
Beiträge
3.082
Eine statische Variable löst das Problem ja auch nicht. Die kann man nicht mehr verändern…

Natürlich kann man die verändern! Konstanten definierst du anders! Ne statische Variable ist dazu da, Informationen bereitzustellen, welche unabhängig von den einzelnen Objekten der Klasse ist. Bsp. z.B. hier.

Die Kindklasse soll gleichzeitig ein Klon der Elternklasse sein und ihre eigenen Methoden einbringen können.

Das ist das Grundprinzip der Vererbung, also erklärt immer noch nicht genau dein Anliegen. Versuch es bitte nochmal besser auszudrücken, ich habe es immer noch nicht genau verstanden.

Edit: so, nach nochmaligen durchlesen meine ich dein Anliegen verstanden zu haben:
<?php
class Eltern {
protected $var;
public function __construct($param) {
$this->var = $param;
}
}

class Kind extends Eltern {
// public function __construct() {

// }

public function out() {
echo $this->var;
}

}
$kind = new Kind('test');
$kind->out();
?>
Das die Variable $var auch in der Kind-Klasse existiert sollte klar sein, das ist ja das Grundprinzip der Vererbung. Nun willst du sicher nicht den Konstruktor von Eltern nochmal in Kind implementieren - musst du auch nicht, der wird ja mit vererbt. Obiger Code funzt. Viell. lags auch daran, wenn du Kind so
$Kind = new Kind;
erstellst, wird natürlich die Variable var gar nicht belegt.

Edit 2: Was mir grad aufgefallen ist: Entferne ja nicht die Kommentare beim zweiten __construct. Wenn du eine __construct ohne Parameter hast, nimmt er immer die, auch wenn du dem Objekt bei der Instanziierung Werte mitgibst (Obwohl nach dem Overloading-Konzept von OOP eigentlich die richtige __construct ausgewählt werden sollte? Oder gilt das bei Konstruktoren nicht?)
 
Zuletzt bearbeitet:

_linx_

Kleiner Weinapfel
Registriert
04.01.09
Beiträge
1.125
Natürlich kann man die verändern! Konstanten definierst du anders! Ne statische Variable ist dazu da, Informationen bereitzustellen, welche unabhängig von den einzelnen Objekten der Klasse ist. Bsp. z.B. hier.
Würde das Problem eigentlich lösen. Ich spiel mal kurz damit rum, und schreib dann mal mein Ergebniss hier.
Das ist das Grundprinzip der Vererbung, also erklärt immer noch nicht genau dein Anliegen. Versuch es bitte nochmal besser auszudrücken, ich habe es immer noch nicht genau verstanden.
Vererbung ist das übernehmen von Methoden und Eigenschaften im Ursprungszustand. Ein Klon ist eine Kopie, die sich mit der Ursprungsklasse verändert.
Bsp:

Klasse A ( $var )
Klasse B extends Klasse A

In Klasse B habe ich nun $var zur Verfügung, aber wenn ich in der Instanz von Klasse A $var ändere, bleibt der Wert in Klasse B gleich.

Klasse A ( $var )
Klasse B = clon Klasse A

Wenn ich nun in Klasse A den Wert verändere, ist der Wert in Klasse B gleich dem neuen Wert in Klasse A. Das ganze funktioniert auch umgekehrt.
 

_linx_

Kleiner Weinapfel
Registriert
04.01.09
Beiträge
1.125
So, nun meine Ergebnisse (übersichtshalber in einem neuen Post):

Das mit den statischen Variablen löst tatsächlich das Problem. Jedenfalls teilweise. Hätte ich auch selber drauf kommen können. Das verbleibende Problem lässt sich aber durch umprogrammieren lösen. Freut mich.

Wieso liegt eigentlich die Lösung immer so nahe? Und wieso übersieht man die einfachste Lösung einfach immer?
 

naich

Pomme d'or
Registriert
22.11.08
Beiträge
3.082
Aha, ich kenne den Begriff Clon nur als (dann eigenständige) Kopie eines Objektes. Dass dabei Variablen mit "syncronisiert" werden sollen, wobei sich die Methoden in den 2 Klassen scheinbar unterscheiden sollen, ist mir neu.
In welcher Sprache ist denn dieses Konzept so implementiert, wie du es beschrieben hast? Oder ist das nur durch so nen Rumgemache wie den static-Variablen möglich??
 

_linx_

Kleiner Weinapfel
Registriert
04.01.09
Beiträge
1.125
Das ist ja jetzt PHP, und ich kenne auch nur diese Sprache so gut. JavaScript ein wenig, aber das kann man nicht wirklich Sprache nennen.

Bei einem Klon in PHP unterscheiden sich die Methoden allerdings nicht. Ein geklontes Objekt ist eigentlich nur ein Alias für ein anderes Objekt. Meine Idee/Mein Wunsch war allerdings, dass ich einen Klon um Methoden erweitern kann, was allerdings nicht direkt möglich ist, sondern via static-Variablen/Methoden ähnlich umgesetzt werden kann.