Hallo,

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?


Mvg


Tim
<?php

class Photo extends Set
{

}

?>
?
bedoel je zoiets........

<?php
class Photo {
public $id;
public $omschrijving;
public $jaar;
}

class PhotoSet
public $photoset = array();

function __construct() {
}

function addPhoto($id,$omschrijving,$jaar) {
$Photo = new Photo($id,$omschrijving,$jaar);

$this->photoset[] = $Photo;
}
}
?>
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);

?>
Tim S
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.
Boaz schreef op 06.07.2008 20:30
Ja, er is vast een SPL class om op te extenden

SplObjectStorage bijvoorbeeld lijkt mij hier heel geschikt voor.

edit: quote verduidelijkt
Jelmer, daar (SplObjectStorage) begin je natuurlijk niet aan als je net met OOP begint, dat komt pas als je wat meer ervaring hebt met OOP....

Je eerdere post (dd:06.07.2008 20:18) laat dan een betere indruk achter.

TS:
Er zijn meerdere wegen welke naar Rome leijden.
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).

Bedankt voor jullie reacties!!
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

Reageren