Bekijk Volledige Versie : PHP Classes
Hallo lezer,
Stel, ik heb twee classes: Auto en Wiel. De class Auto heeft o.a. een var
Merk een array Wielen, waarvan elk element gevuld kan worden met een Wiel
object. In de class Wiel wil ik achterhalen wat het Merk van de Auto is
waarvan dat specifieke Wiel object een element van is. Hoe kan ik dat doen?
Een voorbeeld zie je hieronder. In de laatste regels zie je het probleem
omschreven als term "parentMerk ".
$mijnLada = new Auto;
$mijnLada ->Merk = "Lada";
$mijnLada->Wielen[0] = new Wiel;
$mijnLada->Wielen[0]->Merk = "Dunlop";
echo($mijnLada->Wielen[0]->PastDeWiel() );
class Auto {
var $Merk;
var $Wielen;
}
class Wiel {
var $Merk;
function PastDeWiel() {
if ($this->Merk == "Dunlop" && parentMerk == "Lada" ) {
return false;
}
else {
return true;
}
}
}
Michiel de Roo
20/05/06, 15:20
Jorr.it wrote:
> Hallo lezer,
>
> Stel, ik heb twee classes: Auto en Wiel. De class Auto heeft o.a. een var
> Merk een array Wielen, waarvan elk element gevuld kan worden met een Wiel
> object. In de class Wiel wil ik achterhalen wat het Merk van de Auto is
> waarvan dat specifieke Wiel object een element van is. Hoe kan ik dat doen?
> Een voorbeeld zie je hieronder. In de laatste regels zie je het probleem
> omschreven als term "parentMerk ".
>
>
>
> $mijnLada = new Auto;
> $mijnLada ->Merk = "Lada";
> $mijnLada->Wielen[0] = new Wiel;
> $mijnLada->Wielen[0]->Merk = "Dunlop";
> echo($mijnLada->Wielen[0]->PastDeWiel() );
>
> class Auto {
> var $Merk;
> var $Wielen;
> }
>
> class Wiel {
> var $Merk;
> function PastDeWiel() {
> if ($this->Merk == "Dunlop" && parentMerk == "Lada" ) {
> return false;
> }
> else {
> return true;
> }
> }
> }
Een oplossing zou zijn om de class Wiel een reference naar de bijbehorende
auto mee te geven:
class Wiel
{
var $auto;
function Wiel(&$auto)
{
$this->auto =& $auto;
}
function PastDeWiel()
{
.....
if($this->auto->Merk=='Lada') {
....
}
}
}
en:
$mijnLada->Wielen[0] = new Wiel($mijnLada);
De vraag die blijft hangen is wel of het merk auto een eigenschap van het
wiel is, en dus of je dit op een dergelijke manier zou moeten opzetten.
Warden Dave
20/05/06, 15:20
"Jorr.it" <jorrit@jorr.punt.it> wrote:
> Hallo lezer,
Hallo schrijver Jorr.it,
> Stel, ik heb twee classes: Auto en Wiel. De class Auto heeft o.a. een
> var Merk een array Wielen, waarvan elk element gevuld kan worden met
> een Wiel object. In de class Wiel wil ik achterhalen wat het Merk van
> de Auto is waarvan dat specifieke Wiel object een element van is.
> Hoe kan ik dat doen?
<knip>
Je kunt een property als 'ownerObject' aan je Wiel toevoegen (of in dit
geval wat minder universeel 'autoObject' o.i.d.). Je geeft die eigenschap
dan bij de aanmaak van een Wiel Object als argument aan de constructor.
[Dus bijv.: $wielObject = $mijnLada->Wielen[] = new Wiel($mijnLada); ]
Je kunt dan iets zeggen als: echo $wielObject->autoObject->Merk;
WD
Warden Dave
20/05/06, 15:20
"Michiel de Roo" <yourlove@welovespam.nl> wrote:
> function Wiel(&$auto)
> {
> $this->auto =& $auto;
> }
Waarbij mag worden opgemerkt dat in PHP5 het expliciete refereren onnodig is
omdat ook voor objecten 'by reference' de default is.
WD
Michiel de Roo wrote:
> Jorr.it wrote:
>> Stel, ik heb twee classes: Auto en Wiel. De class Auto heeft o.a.
>> een var Merk een array Wielen, waarvan elk element gevuld kan worden
>> met een Wiel object. In de class Wiel wil ik achterhalen wat het
>> Merk van de Auto is waarvan dat specifieke Wiel object een element
>> van is. Hoe kan ik dat doen? Een voorbeeld zie je hieronder. In de
>> laatste regels zie je het probleem omschreven als term "parentMerk ".
>
> Een oplossing zou zijn om de class Wiel een reference naar de
> bijbehorende auto mee te geven:
Perfect, bedankt!
Warden Dave wrote:
> "Jorr.it" <jorrit@jorr.punt.it> wrote:
>> Stel, ik heb twee classes: Auto en Wiel. De class Auto heeft o.a. een
>> var Merk een array Wielen, waarvan elk element gevuld kan worden met
>> een Wiel object. In de class Wiel wil ik achterhalen wat het Merk van
>> de Auto is waarvan dat specifieke Wiel object een element van is.
>> Hoe kan ik dat doen?
> <knip>
>
> Je kunt een property als 'ownerObject' aan je Wiel toevoegen (of in
> dit geval wat minder universeel 'autoObject' o.i.d.). Je geeft die
> eigenschap dan bij de aanmaak van een Wiel Object als argument aan de
> constructor. [Dus bijv.: $wielObject = $mijnLada->Wielen[] = new
> Wiel($mijnLada); ]
Nogmaals bedankt. Ik heb toch nog een vraagje over de laatste regel code die
WD noemt. Ik zou dit ook graag by reference willen zetten, dus zo:
$wielObject =& $mijnLada->Wielen[] =& new Wiel($mijnLada);
Dit geeft echter een foutmelding in PHP4. Wat is de beste manier om dit dan
wel te doen?
--
Interessante page over references in PHP4:
http://www.obdev.at/developers/articles/00002.html
Jorr.it wrote:
> $wielObject =& $mijnLada->Wielen[] =& new Wiel($mijnLada);
>
> Dit geeft echter een foutmelding in PHP4. Wat is de beste manier om
> dit dan wel te doen?
Oja, vooralsnog gebruik ik deze (omslachtige) methode:
$mijnLada->Wielen[] =& new Wiel($mijnLada);
$wielObject =& $mijnLada->Wielen[count($mijnLada->Wielen)-1];
Warden Dave
23/05/06, 22:00
"Jorr.it" <jorrit@jorr.punt.it> wrote:
> $wielObject =& $mijnLada->Wielen[] =& new Wiel($mijnLada);
>
> Dit geeft echter een foutmelding in PHP4. Wat is de beste manier om dit
> dan wel te doen?
Je kunt denkelijk zonder die expliciete referenties in die expressie (al
durf ik m'n hand niet in het vuur te steken voor alle PHP4 versies; sommigen
lijken niet van het object-kopieeren af te houden te zijn).
Het is makkelijk te testen met iets als:
class Auto {
var $merk;
var $kleur;
var $wielen = array();
function Auto($merk, $kleur) {
$this->merk = $merk;
$this->kleur = $kleur;
}
}
class Wiel {
var $auto;
function Wiel(&$auto) {
$this->auto =& $auto;
}
}
$a = new Auto("Lada", "rood");
$w = $a->wielen[] = new Wiel($a);
$a->kleur = "blauw";
echo $w->auto->kleur;
echo $a->wielen[0]->auto->kleur;
Als je dan nog 'rood' ziet is er pas iets mis...
WD
Warden Dave
24/05/06, 10:00
"Jorr.it" <jorrit@jorr.punt.it> wrote:
> Jorr.it wrote:
>> $wielObject =& $mijnLada->Wielen[] =& new Wiel($mijnLada);
>>
>> Dit geeft echter een foutmelding in PHP4. Wat is de beste manier
>> om dit dan wel te doen?
Je hoeft hier niet per se zo expliciet te refereren omdat ook een
kopie van het geconstrueerde Wiel Object de juiste verwijzing naar
het Auto Object zal bevatten. Zoals ik in de eerdere postjes
schreef kun je dus gewoon toe met:
$wielObject = $mijnLada->Wielen[] = new Wiel($mijnLada);
[ Ik neem overigens aan dat een antwoord, mocht je 't toch willen
weten, zou kunnen zijn: $o = $a[] =& new obj($r); ]
WD
Michiel de Roo
24/05/06, 10:40
Jorr.it wrote:
> Jorr.it wrote:
>
>>$wielObject =& $mijnLada->Wielen[] =& new Wiel($mijnLada);
>>
>>Dit geeft echter een foutmelding in PHP4. Wat is de beste manier om
>>dit dan wel te doen?
>
>
> Oja, vooralsnog gebruik ik deze (omslachtige) methode:
>
> $mijnLada->Wielen[] =& new Wiel($mijnLada);
> $wielObject =& $mijnLada->Wielen[count($mijnLada->Wielen)-1];
dit zou zonder meer eenvoudiger kunnen met:
$wielObject =& new Wiel($mijnLada);
$mijnLada->Wielen[] =& $wielObject;
;-)
Warden Dave
24/05/06, 11:00
"Warden Dave" <warden_dave@mnsys.invalid> wrote:
> [ Ik neem overigens aan dat een antwoord, mocht je 't toch willen
> weten, zou kunnen zijn: $o = $a[] =& new obj($r); ]
....Wat echter niet correct is. 't Lijkt in PHP overigens wel met omwegen te
mogen als bijv.: array_push($a, $o =& new obj($r));
WD
Warden Dave
24/05/06, 11:00
"Warden Dave" <warden_dave@mnsys.invalid> wrote:
> ...Wat echter niet correct is. 't Lijkt in PHP overigens wel met omwegen
> te mogen als bijv.: array_push($a, $o =& new obj($r));
Wat natuurlijk ook niet correct is (dat is geen referentie... 1 tikje blind
hedenochtend), maar goed...
WD
Michiel de Roo
24/05/06, 11:00
Warden Dave wrote:
> "Jorr.it" <jorrit@jorr.punt.it> wrote:
>
>> $wielObject =& $mijnLada->Wielen[] =& new Wiel($mijnLada);
>>
>> Dit geeft echter een foutmelding in PHP4. Wat is de beste manier om dit
>> dan wel te doen?
>
>
> Je kunt denkelijk zonder die expliciete referenties in die expressie (al
> durf ik m'n hand niet in het vuur te steken voor alle PHP4 versies;
> sommigen lijken niet van het object-kopieeren af te houden te zijn).
>
In PHP4 wordt alles gekopieerd als je geen expliciete referenties maakt.
Zelfs
$a = new Auto("Lada", "rood");
levert al twee objecten op, new Auto("Lada", "rood") en de kopie ervan die
in $a zit. Alhoewel de eerste natuurlijk niet meer toegenakelijk is. De
reden waarom veel mensen schrijven:
$a =& new Auto("Lada", "rood");
In jouw voorbeeld:
$a = new Auto("Lada", "rood");
$w = $a->wielen[] = new Wiel($a);
$a->kleur = "blauw";
Hier zijn $a en $w->auto hetzelfde, maar je hebt wel drie kopieen van
hetzelfde wiel gemaakt, te weten new Wiel($a), $a->wielen[] en $w.
Warden Dave
24/05/06, 11:00
"Michiel de Roo" <yourlove@welovespam.nl> wrote:
> In jouw voorbeeld:
>
> $a = new Auto("Lada", "rood");
> $w = $a->wielen[] = new Wiel($a);
> $a->kleur = "blauw";
>
> Hier zijn $a en $w->auto hetzelfde, maar je hebt wel drie kopieen van
> hetzelfde wiel gemaakt, te weten new Wiel($a), $a->wielen[] en $w.
Natuurlijk (al gaat het originele object waarmee de constructor aan de slag
is verloren), maar zoals ik al opmerkte is de 'auto'-referentie in de
kopieen correct; daar ging het om. (Je kunt wel overal expliciet refereren,
maar niet altijd is dat nuttig.)
WD
Warden Dave
24/05/06, 11:20
"Warden Dave" <warden_dave@mnsys.invalid> wrote:
> Natuurlijk (al gaat het originele object waarmee de constructor aan de
> slag is verloren), maar zoals ik al opmerkte is de 'auto'-referentie in de
> kopieen correct; daar ging het om. (Je kunt wel overal expliciet
> refereren, maar niet altijd is dat nuttig.)
Maar je hebt hier gelijk, had ik moeten toevoegen, omdat werken met een
kopie van een Wiel Object niet zo nuttig is en je bij bewerking meer aan een
'hardlink' hebt.
WD
Warden Dave
24/05/06, 11:40
"Michiel de Roo" <yourlove@welovespam.nl> wrote:
[PHP4]
> De reden waarom veel mensen schrijven:
>
> $a =& new Auto("Lada", "rood");
Nog even daarover... Die referentie is pas echt noodzakelijk als er bijv.
binnen de constructor met een blijvende referentie naar het onderhavige
object wordt gewerkt. Anders kun je met de kopie toe (wat, enigzins vreemd,.
de voorkeur 'zou hebben'; zie de handleiding).
WD
Michiel de Roo
24/05/06, 12:20
Warden Dave wrote:
> "Michiel de Roo" <yourlove@welovespam.nl> wrote:
>
> [PHP4]
>
>> De reden waarom veel mensen schrijven:
>>
>> $a =& new Auto("Lada", "rood");
>
>
> Nog even daarover... Die referentie is pas echt noodzakelijk als er
> bijv. binnen de constructor met een blijvende referentie naar het
> onderhavige object wordt gewerkt. Anders kun je met de kopie toe (wat,
Je hebt toch altijd $this, dus waarom zou je dat willen ?
> enigzins vreemd,. de voorkeur 'zou hebben'; zie de handleiding).
He maken van een reference heeft de nodige overhead, vandaar de voorkeur
voor kopieren in de handleiding. Voor een object vraag ik me echter af of
het kopieren niet meer overhead is. Voor primitieve variabelen zal dat
waarschijnlijk niet zo zijn. Ik heb het echter nooit uitgezocht, mogelijk
ligt de waarheid in het midden.
Warden Dave
24/05/06, 12:40
"Michiel de Roo" <yourlove@welovespam.nl> wrote:
> Warden Dave wrote:
>> "Michiel de Roo" <yourlove@welovespam.nl> wrote:
>>> $a =& new Auto("Lada", "rood");
>> Nog even daarover... Die referentie is pas echt noodzakelijk als er
>> bijv. binnen de constructor met een blijvende referentie naar het
>> onderhavige object wordt gewerkt. Anders kun je met de kopie toe
>> (wat,
> Je hebt toch altijd $this, dus waarom zou je dat willen ?
Eh, waarom zou je 'wat' willen? (Niet veel mensen wensten 'per default' een
kopie en in PHP5+ is die gekkigheid dan ook voorbij. Maar als je niet binnen
de constructor aan dat originele Object - m.b.v. $this - gaat refereren dan
is een kopie ook best; meer zei ik niet. Men ziet:
http://www.php.net/manual/en/language.oop.newref.php)
WD
Michiel de Roo
24/05/06, 12:40
Warden Dave wrote:
> "Michiel de Roo" <yourlove@welovespam.nl> wrote:
>
>> Warden Dave wrote:
>>
>>> "Michiel de Roo" <yourlove@welovespam.nl> wrote:
>
>
>>>> $a =& new Auto("Lada", "rood");
>
>
>>> Nog even daarover... Die referentie is pas echt noodzakelijk als er
>>> bijv. binnen de constructor met een blijvende referentie naar het
>>> onderhavige object wordt gewerkt. Anders kun je met de kopie toe
>>> (wat,
>
>
>> Je hebt toch altijd $this, dus waarom zou je dat willen ?
>
>
> Eh, waarom zou je 'wat' willen? (Niet veel mensen wensten 'per default'
> een kopie en in PHP5+ is die gekkigheid dan ook voorbij. Maar als je
> niet binnen de constructor aan dat originele Object - m.b.v. $this -
> gaat refereren dan is een kopie ook best; meer zei ik niet. Men ziet:
> http://www.php.net/manual/en/language.oop.newref.php)
Ah, OK. Het is me nu duidelijk wat je bedoelt.