Vanmiddag had ik even een discussie met Erwin H over class properties. Erwin kwam toen met een argument dat bij een container class het aantal properties op zichzelf een property is van de container.

Dit bracht mij tot de volgende vraag...

Als ik properties wil counten (bijvoorbeeld in een parameterbag class) dan gebruik ik een count() functie die de properties telt. Nu zat ik me te bedenken, je zou ook een "count" property kunnen instellen en die telkens ophogen als er iets wordt toegevoegd aan de parameterbag class. In je set functie zou je dan $this->count++ kunnen doen. Maar... is dat gebruikelijk? Het mooie is dat je dan op het moment van ophalen geen berekening hoeft uit te voeren, maar enkel de inhoud van een property hoeft terug te geven. Het nadeel is dat je bij iedere set (of remove) de "count" property moet aanpassen. Wat is nu het beste OOP gebruik? Is het een beter dan het ander?
Ik zou het bijvoorbeeld via een $this->getCount() functie o.i.d. doen.. Deze berekend op het moment van aanroepen het aantal.
Dankjewel voor je reactie Erik. Dat is ook hoe ik het nu doe (behalve dan dat ik de functie "count" noem). Maar ik vroeg me dus af of dat de gebruikelijke manier is. Of zou je dus ook een "count" property kunnen bijhouden die telkens als er iets wordt geset de waarde optelt. Zeg maar zoiets als dit (even snel):

<?php
class Foo {

private $count;
private $parameters = array();

public function set($key, $value) {
$this->parameters[$key] = $value;
$this->count++;
}

public function count() {
return $this->count;
}

}
?>
Wordt dat wel eens op deze manier gedaan?
nee, nooit gedaan en ook niet van plan. Ik zie niet in waarom je omwegen en niet-eigenschappelijke-properties wilt gebruiken.

[offtopic]Ik hoop dat je ook [php]Countable[/php] implementeert, je gebruik de functie nu toch al, dus een extra handigheidje kan wel :)[/offtopic]
"niet-eigenschappelijke-properties" mooi woord :-)

Tja, dat vroeg ik me dus ook al af, maar Erwin kwam daar vanmiddag ineens, dus daardoor ging ik twijfelen. Oké, dan laat ik het zoals het is.

Countable zou ik kunnen implementeren, maar heeft volgens mij geen extra meerwaarde. Het enige wat ik dan extra kan doen is count($parameterbag) waarbij $parameterbag dan het object is. Ik vind het mooier om dan $parameterbag->count() te doen. Tenzij ik nu iets over het hoofd zie waardoor ik wel Countable zou moeten gebruiken?
Uitgangspunt (kan je op meer momenten gebruiken): geen data onnodig 'cachen'.

Het property count is gedefinieerd door het aantal elementen. Je kan het aantal dus op elk moment berekenen door die elementen te tellen. Op het moment dat je het op gaat slaan in een variabele sla je het dubbel op, je cached het dus. Dat is alleen nuttig als de berekening te lang duurt om het voor elke aanvraag te doen. Als het niet intensief is zorgt die extra cache alleen maar voor meer geheugengebruik en voor meer mogelijke inconsistenties. Wat als het aantal verandert en je ergens bent vergeten om die variabele aan te passen?
Erwin H op 09/03/2013 09:17:51

Uitgangspunt (kan je op meer momenten gebruiken): geen data onnodig 'cachen'.

Het property count is gedefinieerd door het aantal elementen.

Oké, duidelijk. Maar is een count van het totaal aantal properties op zichzelf eigenlijk wel een property?

In bepaalde situaties zou count echt een property kunnen zijn. Als ik het zo snel even bedenk dan denk ik bijvoorbeeld aan een auto (object) met 5 (count) deuren. Maar een auto heeft nog veel meer dan 5 deuren. Ik heb bijv. nog nooit ergens vermeld zien staat: auto met 456 onderdelen. Snap je wat ik bedoel?

Ander voorbeeld. Stel we kopen een televisie. Dan zou een eigenschap het aantal mogelijk te ontvangen zenders zijn, maar bijv. niet het aantal onderdelen waaruit de televisie bestaat.

Dus je kunt je af vragen wanneer count echt een proptery van een object is.
Ozzie PHP op 09/03/2013 13:14:06
In bepaalde situaties zou count echt een property kunnen zijn. Als ik het zo snel even bedenk dan denk ik bijvoorbeeld aan een auto (object) met 5 (count) deuren. Maar een auto heeft nog veel meer dan 5 deuren. Ik heb bijv. nog nooit ergens vermeld zien staat: auto met 456 onderdelen. Snap je wat ik bedoel?
Dat speelt bijvoorbeeld bij een winkelwagentje. Als iemand 3 A's en 4 B's bestelt, bevat het winkelwagentje 2 soorten artikelen en in totaal 7 artikelen. De vier tellingen kunnen dan op verschillende plaatsen en tijdstippen relevant zijn.

Dat zou inderdaad kunnen, maar sla je dan de count als property op, of bereken je die?
Ozzie PHP op 09/03/2013 13:14:06
Maar is een count van het totaal aantal properties op zichzelf eigenlijk wel een property?

Wat is dat nu weer voor vraag? Wat voor antwoord wil je horen? Ja, nee, soms, vaak, niet altijd?
Je bent weer op zoek naar een antwoord dat er niet is. Jij kan zelf ook wel bedenken dat in de ene situatie het wel zo is en in de andere situatie niet. Als jij voor welke reden dan ook dat aantal nodig hebt, dan is het een property. Heb je het niet nodig, dan is het geen property. Het aantal onderdelen van een auto staat inderdaad niet in de advertentie vermeld, maar geloof mij dat iemand bij de fabrikant dat wel degelijk bijhoudt. De man die verantwoordelijk is voor de voorraad aan onderdelen weet precies hoeveel er nodig is voor hem is het dus wel een belangrijk property.

Haha, ja daar zit wel wat in :-)

Reageren