Ik ben afgelopen week begonnen met OOP in php en ik heb een
vraagje. Ik wil een soort fotoverzameling maken waarin mensen
foto's kunnen uploaden. Elke keer dat er geupload word (multiple
upload script) worden de geuploade foto's in 1 set gestopt. Dus
bekijk ik dit in OOP dan heb ik een class 'PhotoSet' en een
class 'Photo'. Ik moet dus met een opdracht, objecten 'Photo' kunnen
toevoegen aan mijn object 'Set'. Maar in een class kan ik geen
nieuwe class aanmaken? Iemand een idee? Ben ik dom bezig of
is er wel een manier om dit te doen?
Ik zou de Photo-instantie buiten PhotoSet aanmaken. Zo kan je eventueel ook nog andere dingen toevoegen (bijvoorbeeld een Film-object, mocht je daar later eens aan beginnen)
<?php
class PhotoSet {
protected $items;
public function __construct() {
$this->items = array();
}
public function addPhoto($photo) {
$this->items[] = $photo;
}
}
class Film {
public $name;
}
$photo = new Photo();
$photo->name = 'lolrus';
$photo2 = new Film();
$photo2->name = 'lolcat';
$photoset = new PhotoSet();
$photoset->addPhoto($photo);
$photoset->addPhoto($photo2);
Maar in een class kan ik geen
nieuwe class aanmaken? Iemand een idee? Ben ik dom bezig of
is er wel een manier om dit te doen?
Nee, dat klopt dat kan niet.
Maar, ben je er zeker van dat je een class in een class wil aanmaken? Ik bedoel heb je het niet over een object aanmaken zoals in de post van Noppes? Wat ik overigens een hele foute oplossing vind.
Ik snap je niet helemaal, maar denk dat je iets als dit nodig hebt:
<?php
class Photo {
// properties, getters, setters...
}
class PhotoSet extends .... // Ja, er is vast een SPL class om op te extenden
{
public function add(Photo $photo) {
// photo aan een interne array toevoegen...
}
}
Maar ik kan er naast zitten gezien je verhaal mij niet helemaal duidelijk is.
Ik vind de oplossing van Jelmer wel een mooie oplossing,
zeker aangezien ik er dan verschillende items aan toe kan
voegen. Ik ga hier even mee experimenteren!
Het klinkt en is misschien heel dom maar ik begin liever even
zelf te experimenteren met OOP dan dat ik meteen ga extenden
op een al bestaande class. (ookal is dat een van de efficientste
mogelijkheden van OOP).
Mijn SplObjectStorage-reactie was vooral een reactie op de reactie van Boaz. Als je iets wilt extenden om bijvoorbeeld de optimalisaties van PHP zelf te benutten, dan zou dat een keuze kunnen zijn (ArrayObject kan bijvoorbeeld ook, en volgens mij komt er binnenkort ook een SplStack o.i.d, misschien dat dat in een bepaalde situatie ook handig is) Maar extenden is hier op zich niet nodig, en optimalisaties zijn niet iets waar je in dit stadium je serieus mee bezig hoeft te houden.
Wel trouwens interessant om even naar die klassen te kijken, om te zien hoe anderen het collectie-probleem voor wat algemenere gevallen hebben opgelost.
En het leukste is het wanneer je zelf al een idee, of een uitwerking ervan hebt gemaakt, en zo goed als dezelfde oplossing terugvindt in uitwerkingen zoals Spl en Zend Framework. Ik vind het altijd behoorlijk bevredigend wanneer blijkt dat ik op eigen houtje tot dezelfde oplossing ben gekomen als de waarschijnlijk meer ervaren programmeurs :P