magic __get __set
Pagina: « vorige 1 2 3 4 volgende »
Wouter J op 01/02/2013 16:07:31:
Ozzie, sorry dat ik het zeggen moet, maar je klinkt de laatste tijd een beetje geïrriteerd. Ik denk ook dat wij iets minder goed jou topics beantwoorden dan eerst. Weet je waardoor dat komt? Dat komt omdat je de laatste tijd alleen maar performance topics opent.
En je stelt de laatste tijd ook wel veel vragen die je 123 kunt opzoeken op google. Misschien handig om daar ook wat tijd in te steken (in het gebruik of in het leren te gebruiken).
En je stelt de laatste tijd ook wel veel vragen die je 123 kunt opzoeken op google. Misschien handig om daar ook wat tijd in te steken (in het gebruik of in het leren te gebruiken).
Wouter, in reactie op jouw opmerkingen hierboven... Ik weet niet of ik geïrriteerd klink. Valt wel mee hoor. Ik had juist eerder het idee dat jij geïrriteerd was, gezien je soms korte antwoorden en verwijzingen naar Google.
Laat ik voorop stellen dat ik altijd eerst Google (en php.net) raadpleeg. Ik neem aan dat je me daarvoor inmiddels lang genoeg "kent". Als ik dan doorverwijzingen naar Google krijg, dan zou het best kunnen dat ik daarvan wat geïrriteerd raak. Maar goed, zand erover.
Ik begrijp dat ik veel vragen stel over performance issues, maar dat is wel met een reden. Ik wil NU zoveel mogelijk de juiste keuzes maken, in plaats van dat ik achteraf alles moet aanpassen. Daarom steek ik liever NU wat meer aandacht in het vinden van de juiste keuze. Voor jullie misschien vervelend, maar voor mij wel belangrijk (en als je het als vervelend ervaart.. je hoeft natuurlijk niet te reageren).
Betreffende de magic __set en __get functie heb ik (jawel dankzij Google) gelezen dat er mensen zijn die dit afraden vanwege performance issues.
De vraag die ik hier stelde en nog steeds stel, is of mensen hier op dit forum gebruik maken van de magic __set en __get method. Ik hecht namelijk meer waarde aan de reacties van mensen hier die ik "ken" (denk aan Wouter, Erwin, Ward, Ger) dan aan iemand die voor mij anoniem is en ergens op een onbekend forum een reactie plaatst. Dus ja, ik heb zelf gebenchmarkt (maar aangezien mijn framework nog lang niet klaar is kan ik niet uitgebreid testen) en ja ik heb zelf op Google gekeken.
Hetgeen waar ik voornamelijk benieuwd naar ben is, of als ik mijn configuratiesettings get en set via de magic methods, of ik daar dan performanceverlies door leid, zoals op sommige fora wordt beweerd.
Ik vind het prettiger om dit te schrijven:
echo $this->container->paths->private->library;
dan dit:
echo $this->container->get('paths')->private->library;
En ik vind het prettiger om dit te schrijven:
$this->container->config->setting = $value;
dan dit:
$this->container->set('config', array('setting' => 'value');
Maar als dit alles tot merkbaar performanceverlies leidt, dan kies ik toch voor de normale (niet-magic) methode.
Dat is en was eigenlijk mijn enige vraag.
P.S. Ik heb zojuist een hond gered bij een woonboulevard in mijn woonplaats. Ik was weliswaar zeiknat geregend, maar het beestje is weer veilig bij z'n bazin. :-) Was 6 kilometer van huis gelopen!
Ozzie PHP op 01/02/2013 18:06:23:
P.S. Ik heb zojuist een hond gered bij een woonboulevard in mijn woonplaats. Ik was weliswaar zeiknat geregend, maar het beestje is weer veilig bij z'n bazin. :-) Was 6 kilometer van huis gelopen!
Na al dat gel*l over magie, toch nog iets positiefs :-)
Nu nog iemand die eindelijk mijn vraag kan beantwoorden met een "wel doen" of "niet doen" en dan is dit nu al de mooiste dag van de maand :D
Oftewel niet gebruiken, tenzij strikt noodzakelijk.
Kijk eens naar zf2, en vooral naar de implementatie van di en de hydrator classes.
En er is niet 1 antwoord te geven. Vind je jou methode mooier dan gebruik je die, ik prefereer de get method (dus niet magic), maar alleen omdat ik dat mooier vind.
Offtopic:
Oh, en ik ben niet geïrriteerd. :-) Hoogstens een beetje vermoeid door de vele performance topics. Maarja, je hebt gelijk ik hoef niet te reageren.
Gewijzigd op 01/02/2013 23:08:26 door Wouter J
Maar dit is dus wel grappig. Jij zegt eigenlijk... kies de methode die je zelf het mooiste vindt. Maar lees ik het commentaar daarboven....
"de __get en __set methods kosten een hoop geheugen, zelf prefereer ik gewone getters en setters boven de magic methods.
Oftewel niet gebruiken, tenzij strikt noodzakelijk."
... dan maakt mij dat dus aan het twijfelen...
En dat zorgt er dus voor dat ik dit soort vragen begin te stellen. De een zegt het maakt niks uit, de ander zegt dat je het niet moet gebruiken omdat het een hoop geheugen kost. En als gevolg van al deze tegenstrijdigheden weet ik het dus niet meer. Ik heb zelf dus een bench-mark gedaan (zie mijn allereerste post) en dan lijkt het verschil niet onoverkomelijk groot te zijn. Echter, de benchmark is gedaan door het echo'en van een value. Ik weet niet of het in een praktijk situatie (een compleet werkende site) wel heel verschil zal uitmaken. En ik kan dat ook niet testen. En daarom vraag ik dus om advies.
de __get en __set methods kosten een hoop geheugen... Oftewel niet gebruiken, tenzij strikt noodzakelijk.
Waarop baseer jij dit? Heb je een bench-mark gedaan?
Maak je gebruik van een framework?
Zoals ik al eerder zei:
Ik vind het prettiger om dit te schrijven:
echo $this->container->paths->private->library;
dan dit:
echo $this->container->get('paths')->private->library;
En ik vind het prettiger om dit te schrijven:
$this->container->config->setting = $value;
in plaats van dit:
$this->container->set('config', array('setting' => 'value');
Daarom wil ik voor mijn container dus magic getters en setters gebruiken. Maar de een zegt dat het vertragend werkt, de ander weer van niet. Jij zegt ook dat het heel erg vertragend werkt, maar je hebt dit niet getest maar alleen van horen zeggen. Ik vind het nogal lastig om op deze manier een juiste beslissing te kunnen nemen.
en ja, ik ben meer een code hacker. Mooie code heeft bij mij veelal de voorkeur.
echo $this->container->paths->private->library;
is toch mooier dan dit?
echo $this->container->get('paths')->private->library;
By the way... ik neem aan dat het niet slim is om "overal" die magic setters en getters te gebruiken, maar alleen maar voor die container class?
Heb jij trouwens dan een idee waarom er mensen zijn die zeggen dat je het niet moet gebruiken, omdat het volgens hun vertragend werkt? Jij geeft zelf aan dat je er niks van zult merken, maan zij beweren het tegendeel. Hebben zij het dan verkeerd geimplementeerd? Of is de manier waarop de magic methods werken in de nieuwere php versies misschien geoptimaliseerd ten opzichte van oudere versies? Waar komt dat verschil van mening vandaan vraag ik me echt serieus af...
Jij vindt het mooier :) In jou geval heb je 4 keer -> achter elkaar, dan raak ik het overzicht kwijt. Omdat ik in mijn code nooit publieke properties gebruik zou ik bij het gebruik van een normale get method het overzicht hebben: Eerst vragen we een paths property op uit de container, die bevat vervolgens een StdClass waar we vervolgens doorheen surfen.
$paths = $this->container->get('paths');
echo $paths->private->library;
Als jij dit bedoelt, dan is dat op zich ook wel netjes.
(Heb je nog een verklaring voor mijn vraag in mijn vorige bericht)?
En dankzij mijn stricte getter/setter beleid zou het zelfs dit worden:
Quote:
(Heb je nog een verklaring voor mijn vraag in mijn vorige bericht)?
Ik denk dat het door 2 dingen komt:
- Speed optimalisatie in PHP core, de magic methods zijn echt wel sneller geworden in de nieuwere PHP versies
- Interpretatie, wat vind je veel? Raak je in paniek bij 1 ns extra of denk je, ach ja laat maar zitten, ik kan mijn tijd beter investeren in die query die 1000 results ophaalt uit de DB?
Is wel consequent inderdaad... moet ik ook eens over nadenken. Misschien moet ik dat eigenlijk ook wel doen :)
Schiet me trouwens nog iets te binnen. In een van Ward z'n voorbeelden set hij een class property:
private $data = array();
Hij geeft aan dat het een array is. Ik had in mijn container ook zoiets gedaan, maar niet erbij gezet dat het een array was. Toch krijg ik bij het toekennen van waardes aan die array geen warning of notice. Is het dan eigenlijk noodzakelijk om "array()" erbij te zetten? Of hoeft dat niet per se?
Quote:
Is het dan eigenlijk noodzakelijk om "array()" erbij te zetten? Of hoeft dat niet per se?
Dat hoeft niet per se, maar dat komt alleen omdat PHP een lazy type beginner friendly taal is. In elke andere taal zal je errors naar je toe geworpen krijgen. Het is (a) duidelijker, je ziet meteen dat het een array is en (b) strict genomen beter/logischer.
Oké... maar doe je dat dan alleen wanneer het een array is? Want ik meen me te herinneren dat jij nooit lege properties declaret?
Ja, dat doe ik alleen bij arrays. Bij de rest maakt het verschil tussen '' en null niet uit, bij een array wel. Stel bijv. dat je nergens de waarde van $this->data veranderd. Als je dan ergens `implode(', ', $this->data)` doet krijg je wel een mooie warning. Als je gewoon `= array()` toevoegt krijg je geen error, maar gewoon het geen je verwacht (een lege string).
Toevoeging op 02/02/2013 00:38:38:
even een benchmark gedaan..
$this->container vs $this->getContainer()
scheelt ongeveer een halve seconde op een miljoen aanroepen.