Magische methode __get() bij één standaardeigenschap
De class heeft ook maar één public eigenschap: de gegenereerde KIX. Je zou intuítief zeggen dat de getter __get() geen parameter nodig heeft, maar dit eindigt in een “Fatal error: Method ...::__get() must take exactly 1 argument”:
Code (php)
Kan ik inkomen: de magische methode __get() verwacht de naam van het argument dat de getter moet retourneren. Ik heb het nu omzeild met $name = 'kix':
Code (php)
Maar ergens lijkt me dit ook niet okay. De methode retourneert altijd een KIX, ongeacht welke naam je in $name stopt. Deze methode suggereert nu bovendien dat er meer eigenschappen te halen zijn, maar er is er maar één.
Iemand suggesties voor verbeteringen?
Gewijzigd op 02/12/2012 14:45:50 door Ward van der Put
Kun je die functie niet gewoon get of getKix noemen?
$kix = new Kix();
$kix = $kix->get();
Ozzie, een getKIX() kan uiteraard altijd nog. Ik vroeg me meer af hoe je de magische methoden __get() en __set() in dit soort situaties het beste kunt implementeren.
Misschien is __invoke hier beter op zijn plaats?
In je class maak je een functie __set en __get:
Code (php)
Deze gebruik je dan als volgt:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$kix = new Kix();
$kix->test = 'bla bla'; // er wordt nu in de class een property geset met de key test en de waarde bla bla.
echo $kix->test; // de __get functie wordt aangeroepen en op het scherm verschijnt 'bla bla'.
?>
$kix = new Kix();
$kix->test = 'bla bla'; // er wordt nu in de class een property geset met de key test en de waarde bla bla.
echo $kix->test; // de __get functie wordt aangeroepen en op het scherm verschijnt 'bla bla'.
?>
Beetje duidelijk zo?
Tevens zal je scriptje nu ook nooit kunnen werken, je zet je default value nu op een waarde, maar aangezien de __get() method altijd al een argument krijgt wordt de default waarde nooit gebruikt.
Stien, __invoke vind ik al een stuk beter, alleen denk ik niet dat ward hiernaar opzoek is. Ik denk dat Ward __toString() wilt:
Wouter, dank je, dat is het! Ik had hier inderdaad __toString moeten gebruiken.