Hi!
ich habe ein kleines Problem mit der OOP in PHP5.
Auch bei OOP in PHP5 sind die grundlegenden Debuggingmittel, error_reporting auf E_ALL stellen und Kontrollausgaben, von Vorteil, um Fehler zu finden. (Den von Sven erwähnten Tippfehler hab ich korrigiert.)
Ich möchte aus einer Childklasse auf eine Eigenschaft (Variable) der Vaterklasse zugreifen.
Das ist kein Problem, nur das worauf du zugreifen willst, existiert schlicht nicht.
$list = new listbox;
var_dump($list);
object(listbox)#1 (3) {
["items"]=>
object(list_item_f)#2 (3) {
["items"]=>
NULL
["items_collection"]=>
NULL
["browser:private"]=>
NULL
}
["items_collection"]=>
NULL
["browser:private"]=>
NULL
}
$list->items existiert. Soweit so gut.
$list->items->add("1.Item");
var_dump($list);
object(listbox)#1 (3) {
["items"]=>
object(list_item_f)#2 (3) {
["items"]=>
NULL
["items_collection"]=>
array(1) {
[0]=>
object(list_item)#3 (1) {
["value"]=>
string(6) "1.Item"
}
}
["browser:private"]=>
NULL
}
["items_collection"]=>
NULL
["browser:private"]=>
NULL
}
Jetzt gibt es $list->items->items_collection[0]
echo $list->items(0)->value;
Und was macht deine Methode $list->items(0)?
public function items($index)
{
return $this->items_collection[$index];
}
Sie greift auf $list->items_collection zu, was aber NULL ist, weil du es bisher nicht initialisiert hast. Das hat eine Notice zur Folge
Notice: Trying to get property of non-object in ... on line ...
die du nur mit dem E_ALL-error_reporting siehst. Die Kontrollausgabe
var_dump($list->items(0));
liefert ebenfalls NULL. Kein Objekt -> keine Propertys.
Abgesehen davon ist die Methode listbox::items() derzeit relativ zweckfrei. Wenn sie wenigstens eine Index-Prüfung enthielte ...
Und außerdem müsste man noch stutzig werden, warum es nicht bereits in der Methode listbox::items() zu einer Fehlermeldung kam, denn $this->items_collection ist ja NULL und $this->items_collection[$index] greift theoretisch auf einen Index von NULL zu. Warum da keine Meldung kommt, kann ich nicht beantworten. Es hätte aber Notice-Meldungen gegeben, wenn du nicht einfach nur Eigenschaften benennst, sondern ihnen auch einen Default-Wert zuwiesest.
public $items_collection = array();
Und damit gibt es dann auch eine Meldung
Notice: Undefined offset: 0 in ... on line ...
die einen zur Kontrolle der items_collection veranlassen könnte.
Ich vermute, ...
Lass dir deine Vermutungen immer mit Kontrollausgaben bestätigen oder widerlegen!
PS2: Zum Sinn des Ganzen: Ich möchte einige Steuerelemente, die zB: in Visual Basic eingesetzt werden, mit PHP nachbauen. Vom Syntax her soll es sich an .NET orientieren.
Da ging es mir vor einiger Zeit vermutlich ebenso wie dir. Die Idee, .NET-Elemente mit PHP nachzubauen, habe ich aber wieder verworfen. Die Möglichkeiten und vor allem auch Notwendigkeiten unter .NET sind ganz andere als unter PHP. Das teilweise 1:1 nachzubauen bringt wenig außer erhöhter Codekomplexität und Laufzeit. Ein Array unter .NET ist etwas starres. Einmal definiert, ist seine Größe nicht mehr änderbar. Deshalb gibt es da zusätzlich noch Konstrukte wie Collections, die einfach übergebene Objekte hinzunehmen, ohne dass man vorher wissen muss, vieviele es einmal werden. Außerdem gibt es für die verschiedenen Anwendungsfälle verschiedenen Typen von Sammlungen (Collection, Hashtable, Dictionary, und so weiter). PHP hat mit seinem Array-Typ ein universelles Sammlungs"objekt" im Angebot. Es kann verwendet werden als array, list (vector), hash table (an implementation of a map), dictionary, collection, stack, queue, and probably more. Die Notwendigkeit von speziellen Zugriffsfunktionen oder Indexern wie unter .NET ist einfach nicht gegeben, denn die Zugriffsmöglichkeiten, die es bereits von Haus aus mitbringt reichen für den normalen Gebrauch.
KISS. Keep It Short and Simple. Nutze die vorhandenen Möglichkeiten anstatt Kapselungen einzubauen, die nur Laufzeit verbrauchen. Und schau dir die SPL an (ein weiterführender Link ist im Kapitel Introduction zu finden), da findest du jede Menge interessante Klassen und Interfaces, wie ArrayAccess, Countable, Iteratoren, mit denen du zusätzliche Funktionalitäten hinzufügen kannst, das Ergebnis sich aber weiterhin wie PHP anfühlt.
Zum Üben und Erfahrung sammeln (auch negativer) kannst du ja an deinem Vorhaben (noch ein Weilchen) festhalten, aber vom Ziel, es in der derzeit angedachten Form irgendwann produktiv einzusetzen (wenn du das vorhast), rate ich ab.
Lo!