dedlfix: [OOP] Auf Eigenschaften der Vaterklasse zugreifen?

Beitrag lesen

Hi!

Dein Problem ist nicht die Vererbung der Klassen sondern die Anordnung deiner Instanzen. Das ist deine jetzige Struktur:

$listbox = new listbox();

$listbox->items ->(new list_item_f)->items
                                   ->items_collection
        ->items_collection

Das sind zwei Objekte und vier unabhängige Eigenschaften.

$listbox = new list_item_f();

ergäbe stattdessen

$listbox->items
        ->items_collection

mit einem ungenutzten items und der items_collection, die sowohl über die geerbte Methode items() als auch über add() von list_item_f angesprochen werden kann.

Du musst erstmal die Zuständigkeiten in deinem Konzept sortieren. Wenn $items eine Instanz einer ItemsCollection sein soll, dann ist es Aufgabe der ItemsCollection, sich um die Items zu kümmern. Die Listbox selbst hält dann nur einen Verweis auf die Instanz der ItemsCollection aber selbst keinerlei Infrastruktur für die einzelnen Items vor. Wenn die Listbox ein Item braucht, dann fragt sie die ItemsCollection nach eben diesem. Sie greift da nicht einfach selbst durch.

Aber ich ging davon aus, dass [...]

Ja, das habe ich schon aus deinem Ursprungsposting gelesen. Aber wie ist es jetzt? Hast du nun verstanden, wo dein Fehler war?

Eine Änderung der Methode 'items' in 'item', um Konflikte zwischen Methode und Eigenschaft auzuschließen, brachte auch keine Besserung.

Ja klar, mir zumindest, dir jetzt auch?

PS: Es gibt in der Klasse 'listbox' eine Methode 'items', die einen einzelnen Eintrag aus dem Array items_collection zurückgibt und eine Eigenschaft 'items', die die ganzen Methoden für die Manipulation des gesamten 'item_collection' Arrays enthält, zB: add / remove etc.

In .NET würde es, wie folgt, aussehen:

ListBox1.Items.Add("1.Eintrag")
MsgBox(ListBox1.Items(0).ToString)

  
Nein, nicht .NET sondern Visual Basic. In C# schriebe man  
  
  MessageBox(ListBox1.Items[0].ToString())  
  
also eckige Klammern nach Items. Damit sieht man gleich, dass Items keine Funktion ist, sondern dass hier ein Index-Zugriff stattfindet (gelöst über eine Spezialität namens Indexer). Dieses Verhalten kannst du unter PHP nachbilden, wenn du dir die bereits empfohlene SPL ansiehst und dort speziell das Interface ArrayAccess. Wenn du das in der ItemsCollection-Klasse implementiert hast und $listbox->items auf eine Instanz davon verweist, kannst du darauf weiterhin als Objekt zugreifen ($listbox->items->add()) aber auch wie auf ein Array ($listbox->items[0]). Andere Funktionalitäten verlangen die Implementation weiterer Interfaces. Für count($listbox->items) braucht es Countable und foreach ($listbox->items as $item) benötigt das Interface Iterator oder noch besser IteratorAggregate. Mit Iterator kannst du nur eine Iteration verwalten, IteratorAggregate ergibt hingegen voneinander unabhängige Iteratoren.  
  

> Zur .NET Geschichte:  
> Ziel soll nicht sein .NET nachzubauen ;) Ich will vielmehr nur einige Steuerelemente, zB. ListView, als PHP Klasse umsetzen.  
  
Ja, ich hab dein Ziel schon verstanden, ich hatte ja ein solches ja früher selbst einmal für einen kurzen Augenblick. Orientiere dich aber besser nicht nach den Notwendigkeiten von .NET sondern an den Möglichkeiten von PHP nebst dessen Philosophie. .NET-Komponenten sind ziemlich umfangreich, was Code und Methodenanzahl anbelangt, aber im Gegensatz zu PHP wird es kompiliert und ist dann einigermaßen schnell. Unter PHP muss der Code im Wesentlichen so wie du ihn schreibst ausgeführt werden und nicht wie ein Compiler ihn optimiert hat.  
  

> In Sachen .NET war nur geplant, dass die Bedienung dieser Klasse(n) an den .NET Syntax angelehnt sein soll. Mit allem soll die Entwicklung von RIAs erleichtert werden.  
  
Es sollte meines Erachtens nicht das Ziel sein, die "Umdenkfaulheit" des Entwicklers zu unterstützen, dafür aber jede Menge zu wartenden und vielleicht langsam laufenden Code in Kauf zu nehmen.  
  
  
Lo!