Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

php-Bug mit Vererbung von "static" ?

Empfohlene Antworten

Veröffentlicht

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 ^^ ?

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ß

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.

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ß

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.