FragFrog schreef op woensdag 15 december 2010 @ 11:08:
[...]
Erm, dat is dan ook gewoon ranzige code (en dit topic niet onwaardig). Je kan het ook gruwelijk eenvoudig oplossen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| class FORM
{
private $widgets = array(); // Class variabelen hoor je gewoon te declaren.
public function new_widget($form_object)
{
$this -> widgets[$form_object] = $form_object;
}
public function __get ($form_object)
{
return $this -> widgets[$form_object]; // Check toevoegen of'ie wel geset is als je het netjes doet.
}
} |
Vooropgesteld dat je daadwerkelijk het object als identifier wilt gebruiken (wat kan, als je een __toString() methode implementeert in je form_object, dus vooruit) heb je zo prima variabelen die je makkelijk terug krijgt, zonder enig risico whatsoever dat je een class variabele overschrijft. Ze prefixen met een underscore is een ranzige fix voor een probleem wat je niet zou hebben als je wat nettere code schrijft (en dus private variabelen ook private maakt, etc).
Zodra je iets ziet als
PHP:
1
| $object -> $variabele = waarde; |
zouden er eigenlijk al alarmbelletjes moeten gaan rinkelen. Het is maar heel zelden nodig en het zorgt geregeld voor problemen - zoals weer eens gedemonstreert is.
Ik leer graag bij, programeren is een hobby heb tijdens mijn chemie-opleiding nooit les gehad ervan.
In jou script maak je geen nieuwe instant aan van de class WIDGET??
ik zie maar 2 oplossingen
1 ofwel zet ik alle nieuwe instants van WIDGET in een array, en roep ik ze zo aan
2 ofwel maak ik eerst de WIDGET, en voeg ik ze daarna toe aan de FORM
* de class WIDGET samenvoegen met de class FORM is geen optie
Beide oplossingen maken de class net wat ingewikkelder.
Nu gaat dit zo:
form_naam = new FORM
form_naam->setter()
form_naam->new_widget(widget_naam)
form_naam->widget_naam->setter()
heel eenvoudig in gebruik. Alleen die laatste regel zorgt dus voor problemen
Als het anders moet kan het alleen meer zo:
Optie 1 *Ik denk zelfs dat deze code niet werkt
form_naam->get_widget(widget_naam)->setter()
form_naam->widget[widget_naam]->setter()
Optie 2 Dit zou wel nog voordelen kunnen hebben
widget_naam = new widget
widget_naam->setters
form_naam->add_widget(widget_naam)
De huidige manier is wel veel eenvoudiger, nietwaar?
Bij het zoeken naar een makkelijkere manier om formulieren te maken in php kwam ik op OOP. Mijn form-classe is van het eerste uur dat ik OOP heb geleerd. De classe is ondertussen vrij compleet en werkt verrukkelijk. Er komt wel een dag dat ik deze veel netter wil herschrijven vanwege bepaalde tekortkomingen in het huidig ontwerp.