Seite 1 von 1

problem bei vererbung (php)

Verfasst: 03.04.2009, 13:56
von genesisfive
Hallo,

schaut euch mal bitte folgenden Beispielcode an:

Code: Alles auswählen

abstract class A {

private $variable;

public function a() {
    $this->variable = a;
}

public function setVar($var) {
    $this->variable = $a;
}

public funtion show() {
    echo $this->variable;
}

abstract function work();
}

Code: Alles auswählen

class B extends A {

public function work() {
    setVar("XXX");
}
}


Das Problem: ich kan das Feld "variable" der Klasse A ums verrecken nicht verändern!
will heißen:
wenn ich jetzt hingehe und ein Objekt der Klasse B erstelle, work() aufrufe (also sie variable setze) und sie dann mit show() abfrage erhalte ich IMMER einen leeren String, auch das erste Setzen im Konstruktor funktioniert nicht.

ich hab schon alles versucht, vom parentconstructor in B bishin zu einfachen settern. Das einzige was funktioniert ist, wenn ich die variable protected oder public mache, in B redeklariere (!) und ihr dort entweder direkt oder im Kontruktor einen Wert zuweise, aber das bringt mir nichts!

weis da jemand weiter?

Re: problem bei vererbung (php)

Verfasst: 04.04.2009, 19:23
von chillmensch
Also ich habe mit PHP noch nie objektorientiert programmiert, aber das "abstract class A" kommt mir wenn ich an Java denke komisch vor. Bei Java darf man in einer abstrakten Klasse lediglich abstracte Methoden deklarieren und Variablen deklarieren und initialisieren.

Die Methode

public function a()
{
$this->variable = a;
}

macht meines erachtens nach keinen Sinn, was ist "a"? Das übergibst du niht per Parameter, wenn ich richtig gucke...

Genauso wie die Methode

public function setVar($var)
{
$this->variable = $a;
}

müsste das nicht wie folgt implementiert werden?
public function setVar($var)
{
$this->variable = $var;
}

Ich kann die was PHP mit OOP angeht leider nicht kompetent weiterhelfen, wenn ichs mit Java vergleiche stimmt da so einiges nicht. Versuch mal das ganze mit Aptana (kostenlos) zu progammieren, vllt. sagt dir Aptana, was du falsch machst. Und sag und wenn du es löst bitte auch die Lösung ;)

Kann es sein, dass du bei OOP mit PHP auch die Datentypen (int, double, String etc) angeben musst?

Re: problem bei vererbung (php)

Verfasst: 07.04.2009, 11:38
von genesisfive
chillmensch hat geschrieben:Die Methode

public function a()
{
$this->variable = a;
}

macht meines erachtens nach keinen Sinn, was ist "a"? Das übergibst du niht per Parameter, wenn ich richtig gucke...

Genauso wie die Methode

public function setVar($var)
{
$this->variable = $a;
}

müsste das nicht wie folgt implementiert werden?
public function setVar($var)
{
$this->variable = $var;
}


Stimmt da hast du recht, da hab ich beim Beispiel nicht aufgepasst. Aber du hast ja zum Glück erkannt was gemeint war ;)

Das was dir bei den abstrakten Klassen komisch vorkommt verwechselst du in Java mit den Interfaces. In abstrakten Klassen kann man Methoden ganzh normal implementieren und in diesem Methoden auch auf abstrakte, also nicht implementierte Methoden zurückgreifen. Abstrakte Klassen kann man nicht Instanziiren und müssen abgeleitet werden, wo dann die vollständige Implementierung erfolgt. Das ist sehr praktisch wenn man mehrere Klassen mit der selben Logik hat, die sich nur durch wenige Methoden unterscheiden.
Die Datentypen spart man sich in OOP PHP auch, das ist ebenfalls Java ;)

Ich hör mich mal weiter um.

Re: problem bei vererbung (php)

Verfasst: 07.04.2009, 12:02
von chillmensch
Hab grad nochnmal nachgeschlagen, ich habe die abstrakten Klassen nicht mit Interfaces verwechselt. Hatte aber falsch im Kopf, dass abstrakte Klassen nur abstrakte Methoden beinhalten dürfen, was nicht der Fall ist.

Hast du nun schonmal Aptana versucht?

Re: problem bei vererbung (php)

Verfasst: 12.04.2009, 21:04
von chillmensch
und gibts schon was neues?

Re: problem bei vererbung (php)

Verfasst: 27.04.2009, 12:44
von chillmensch
und schon was rausgekommen bisher?

Re: problem bei vererbung (php)

Verfasst: 27.04.2009, 21:08
von -AB-
da ich PHP nur vor einführung von klassen gecoded hab hab ich mal bisher nix gesagt.... ansonsten, gibt es die möglichkeit auf verschiedene arten abzuleiten? (wie in c++, public, protected und private?)

oder muss man voll qualifiziert auf die member zugreifen, also explizit mitteilen dass du auf die basisklasse zugreifst?