Aiun Geschrieben 9. Oktober 2008 Teilen Geschrieben 9. Oktober 2008 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 ^^ ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kein-tee Geschrieben 9. Oktober 2008 Teilen Geschrieben 9. Oktober 2008 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ß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aiun Geschrieben 9. Oktober 2008 Autor Teilen Geschrieben 9. Oktober 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kein-tee Geschrieben 9. Oktober 2008 Teilen Geschrieben 9. Oktober 2008 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ß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aiun Geschrieben 9. Oktober 2008 Autor Teilen Geschrieben 9. Oktober 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.