Zum Inhalt springen

php-Bug mit Vererbung von "static" ?


Empfohlene Beiträge

hi,

entweder habe ich ein tierisches Missverständnis oder PHP ist in dem Sinne Buggy, daher mal die Frage: wo liegt der Fehler und tritt das bei euch auch auf (evtl. ja schon korrigierter bug ?)


<pre><?php

class a
{
public static $attr;
public function echoall()
{
// speichere, lade, tue was wichtiges
echo self::$attr;
}
}

class b extends a
{
public function __construct()
{
self::$attr = '1';
}
}
class c extends a
{
public function __construct()
{
self::$attr = '2';
}
}
$b1 = new b();
echo "b attr ist: ".b::$attr."\n";
$c1 = new c();
echo "b attr ist nun jedoch: ".b::$attr."\n";
?>
[/PHP]

es geht um ein Anwendungsbeispiel das ich vor einiger Zeit hier schon mal besprochen habe und das beispiel oben war die - leider nicht funktionierende - Lösung.

Klasse A stellt Funktionen zur verfügung z.B. zum Laden, Speichern etz. von Daten. Die Struktur, welche Daten und Wohin ist in Kind-Klassen (B,C) abgebildet.

bedeutet: Klasse A muss auf Daten zugreifen die in Klasse B bzw. C gesetzt werden.

Diese Daten sind normalerweise Arrays und müssen ja nicht unbedingt bei jedem Objekt einzeln gespeichert werden (Performance).

Nun überschreibt jedoch der Konstruktor von C die Daten die im Konstruktor von B gesetzt wurden.... WARUM ?

klar, ein wenig logik erkenne ich schon daraus, $attr gehört ja A, aber nach meinem Verständnis ist $attr nachher ein Attribut von B und C (sonst macht die Vererbungs Sache an sich keinen Sinn).

Setze ich jetzt in B und C jeweils auch ein public static $attr wird $attr zu einem Static-Attribut der jeweiligen Klasse, nur A hat keinen Zugriff darauf.

Also nochmal die Frage: php Bug, oder muss ich damit leben ^^ ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nun überschreibt jedoch der Konstruktor von C die Daten die im Konstruktor von B gesetzt wurden.... WARUM ?

Alle von A abgeleiteten Klassen referenzieren auf _dieselbe_ Variable $attr, da sie statisch deklariert wurde. Statische Variablen sind sog. Klassenvariablen, wohingegen Membervariablen als Instanzvariablen bezeichnet werden. Während Instanzvariablen an ein Objekt gebunden sind, werden Klassenvariablen an die Klasse gebunden und sind somit _unabhängig_ vom Objekt.

$attr gehört ja A, aber nach meinem Verständnis ist $attr nachher ein Attribut von B und C (sonst macht die Vererbungs Sache an sich keinen Sinn).

Falsch! $attr gehört sowohl A, als auch allen anderen Klassen, die von A abgeleitet wurden.

Zum Verständnis: Klassenvariablen werden nur ein einziges mal angelegt. Alle Instanzen dieser Klasse greifen auf dieselbe Variable zurück, sodass eine Änderung an der Variablen in einer Instanz für alle Instanzen der gleichen Klasse sichtbar sind.

Also nochmal die Frage: php Bug, oder muss ich damit leben ^^ ?

Das ist kein Fehler von PHP, mehr ein Verständnis- / Designfehler deinerseits.

Gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

na, mir ist schon klar was static ist ;)

das Problem ist, das es demnach keinen "vernünftigen" Weg gibt, Klassenabhängige variablen in einer Vererbung zu verarbeiten.

als nutzer von B und C kann ich ja nicht wissen ob es in B und C oder in A deklariert ist, wenn ich A nicht kenne (Bibliotheksklasse).

Ich habe es jetzt mit einem get_class_vars(get_class($this)) in A gelöst.

danke tee.

Link zu diesem Kommentar
Auf anderen Seiten teilen

na, mir ist schon klar was static ist ;)

Warum hast du es dann in diesem Fall verwendet?

das Problem ist, das es demnach keinen "vernünftigen" Weg gibt, Klassenabhängige variablen in einer Vererbung zu verarbeiten.

Doch, Membervariablen. Anscheinend versteh ich dein Problem hierbei nicht ...

Gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

Membervariablen sind Objektbezogen, nicht Klassenbezogen.

Die Elternklasse soll jedoch funktionalitäten zur verfügung stellen, die strukturinformationen (Klassenbezogen) und Dateninformationen (Objektbezogen) gleichermaßen benötigen.

Da steht z.B. "Deine Daten kommen in Tabelle X der Datenbank Y und müssen vom Controller XY vorher abgesegnet werden"

Beispielhaft.

Die Elternklasse geht dann via Foreach() durch diese Informationen durch, falls die Kindklasse die methode "speichern" aufruft.

Strukturinformationen haben am Objekt nix zu suchen, also static. Aber dennoch sind sie in abhängigkeit der Kindklasse / werden in der eltern-Klasse benötigt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...