>> En die ene methode die je dan zou moeten implementeren, wil je er liefst ook nog uitjassen, desnoods met een *MUST NOT* in commentaar.
Dat is niet wat ik zeg. Die methode hoort erin, alleen ik wil voor mezelf aangeven dat ik die niet handmatig moet aanroepen omdat dat onzin is. Dit is iets anders dan wat jij nu suggereert.
>> Mijn punt is dat je niet iets tweederangs moet lenen als zelf iets eersterangs bouwen beter is.
Maar dat kan toch helemaal niet? Om door een specifieke property van een object te loopen heb je de Iterator of IteratorAggregate interface nodig. Ik kan toch niet tegen PHP zeggen dat ie een bepaalde method moet aanroepen op het moment dat ik een object in een loop gooi?
>> Dat doe je nu eigenlijk wel: je implementeert een interface met maar één methode, maar die ene methode wil je niet implementeren. Dan is de interface dus niet geschikt voor je doel.
Nogmaals, die interface is prima geschikt, alleen ik wil voorkomen dat ik per vergissing handmatig die getIterator method aanroep, omdat dat geen enkele toegevoegde waarde heeft. Mooier zou het zijn geweest als je die method private of protected kon maken, maar dat kan helaas niet.
>> Als het uitvoeren van een loop met een foreach echt je enige doel is, kun je ook nog overwegen om helemaal geen interface te implementeren.
Dat kan ook, alleen als je dan meerdere class properties hebt, dan worden die ook meegenomen in de loop en dat is niet de bedoeling.
"Dat is niet wat ik zeg. Die methode hoort erin, alleen ik wil voor mezelf aangeven dat ik die niet handmatig moet aanroepen omdat dat onzin is. Dit is iets anders dan wat jij nu suggereert."
Waarom zou je het dan ooit aanroepen? Plus het aanroepen kan geen kwaad...
>> Dat kan ook, alleen als je dan meerdere class properties hebt, dan worden die ook meegenomen in de loop en dat is niet de bedoeling.
Okay, nu worden we al concreter. Je wilt een data-object in een foreach steken waarmee je gericht maar één specifieke property ophaalt, niet alle andere properties? Geef eens een voorbeeld?
>> Waarom zou je het dan ooit aanroepen? Plus het aanroepen kan geen kwaad...
Het kan inderdaad geen kwaad. Maar het kan zomaar zijn dat ik over een jaartje ben vergeten (alhoewel... na deze discussie) dat het zinloos is om eerst die method aan te roepen en dan te gaan loopen, omdat ik gewoon direct het object kan loopen. Daarom wil ik in het commentaar zetten dat ik die method niet rechtstreeks moet aanroepen.
@Ward:
>> Okay, nu worden we al concreter. Je wilt een data-object in een foreach steken waarmee je gericht maar één specifieke property ophaalt, niet alle andere properties? Geef eens een voorbeeld?
Dat voorbeeld is het prototype van een array... dus dan wordt de vraag of je wel een OOP-wrapper wilt maken door een gewone array in een array-object te verpakken. Vervang jouw $data door $array en de array is een array-object:
<?php
class ArrayWrapper implements \IteratorAggregate
{
private $array = array();
public function __construct(array $array)
{
$this->array = $array;
}
public function getIterator()
{
return new \ArrayIterator($this->array);
}
}
$array = new ArrayWrapper($data);
foreach ($array as $key => $value)
{
// doe iets met key en value
}
?>
Ward, zo kun je het zien... ik heb een DataCollection waar ik doorheen wil kunnen loopen. En de class property is dan inderdaad een array.
Ik snap alleen niet wat je daarmee wil zeggen.
>> dus dan wordt de vraag of je wel een OOP-wrapper wilt maken door een gewone array in een array-object te verpakken.
Ik denk het dus wel. Ik zie de DataCollection als een object, waarbij ik waardes kan setten en getten. En ik wil er doorheen kunnen loopen. Maar zijn er volgens jou dan betere alternatieven?
Het is dubbelop als je geen functionaliteit toevoegt. Je hebt slechts iets OOP gemaakt dat al bestaat, maar daarbij ook data verplaatst, ten koste van geheugen en processortijd.
Vergelijk het anders met een integer. Dat doe je ook liever zo:
$onvoldoende = 5;
dan zo:
$data = 5;
$onvoldoende = new IntegerObject($data);
>> Het is dubbelop als je geen functionaliteit toevoegt. Je hebt slechts iets OOP gemaakt dat al bestaat, maar daarbij ook data verplaatst, ten koste van geheugen en processortijd.