magic __get __set

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 4 volgende »

Ozzie PHP

Ozzie PHP

01/02/2013 18:06:23
Quote Anchor link
Mensen die serieus gereageerd hebben, dankjulliewel! Zoals ik aangaf gaat het dus inderdaad om een (dependency injection) container waarbij de properties vantevoren niet vast staan.

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).


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!
 
PHP hulp

PHP hulp

19/04/2024 16:24:22
 
Erwin H

Erwin H

01/02/2013 18:12:01
Quote Anchor link
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 :-)
 
Ozzie PHP

Ozzie PHP

01/02/2013 18:13:20
Quote Anchor link
Precies! :-)))

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
 
Local Dev

Local Dev

01/02/2013 22:35:42
Quote Anchor link
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.

Kijk eens naar zf2, en vooral naar de implementatie van di en de hydrator classes.
 
Wouter J

Wouter J

01/02/2013 23:04:26
Quote Anchor link
Local, niet om iemand slecht te maken. Maar als het om DI gaat kun je beter naar Symfony kijken, die gebruikt DI al 2 jaar langer dan ZF2 en is daardoor vele malen verbeterd en geëvolueerd.

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
 
Ozzie PHP

Ozzie PHP

01/02/2013 23:39:00
Quote Anchor link
Ach ja Wouter, we hebben allemaal wel eens onze mindere momentjes... we kunnen immers niet altijd perfect zijn he ;-) Niks menselijks is ons vreemd...

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.
 
Local Dev

Local Dev

01/02/2013 23:39:21
Quote Anchor link
Misschien, ik heb ervaring met beide frameworks, en andere, maar mijn voorkeur gat uit naar zf .. Symfony is een mooi framework, maar heeft ook zijn nadelen .. zf ook .. maarja, smaken verschillen :)

@Ozzie, hoe heb jij dit gebenchmarkt?
Gewijzigd op 01/02/2013 23:41:36 door Local Dev
 
Ozzie PHP

Ozzie PHP

01/02/2013 23:41:24
Quote Anchor link
Local Dev, jij zegt:

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?
 
Local Dev

Local Dev

01/02/2013 23:48:39
Quote Anchor link
Zelf niet, maar een collega van mij wel .. moet de gegevens navragen .. maar ik adviseer om gewoon standaard getters and setters voor een entity te gebruiken.
Maak je gebruik van een framework?
 
Ozzie PHP

Ozzie PHP

01/02/2013 23:53:21
Quote Anchor link
Ik ben zelf een framework aan het schrijven... en ben nu dus aan het overwegen of ik wel of niet magic getters en setters moet gebruiken.

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.
 
Wouter J

Wouter J

01/02/2013 23:55:09
Quote Anchor link
Ik zal dan gewoon het gebruik van magic doen. Die paar microseconde vertraging ga je never te nimmer merken.

en ja, ik ben meer een code hacker. Mooie code heeft bij mij veelal de voorkeur.
 
Ozzie PHP

Ozzie PHP

02/02/2013 00:02:23
Quote Anchor link
Wouter, dat is grappig... als je voor mooie code kiest dan kies je toch juist eerder voor de magic methods? Dit...

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...
 
Wouter J

Wouter J

02/02/2013 00:05:47
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

02/02/2013 00:08:29
Quote Anchor link
Jij zou dus zo doen?

$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)?
 
Wouter J

Wouter J

02/02/2013 00:13:18
Quote Anchor link
Ja of gewoon zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo $this->container->get('paths')->private->library;
?>


En dankzij mijn stricte getter/setter beleid zou het zelfs dit worden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo $this->getContainer()->get('paths')->private->library;
?>


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?
 
Ozzie PHP

Ozzie PHP

02/02/2013 00:21:31
Quote Anchor link
Ah ja... oké, duidelijk... en ook getContainer() ipv $this->container? Grappig :)
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?
 
Wouter J

Wouter J

02/02/2013 00:23:48
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

02/02/2013 00:27:18
Quote Anchor link
Oké... maar doe je dat dan alleen wanneer het een array is? Want ik meen me te herinneren dat jij nooit lege properties declaret?
 
Wouter J

Wouter J

02/02/2013 00:30:35
Quote Anchor link
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).
 
Ozzie PHP

Ozzie PHP

02/02/2013 00:32:12
Quote Anchor link
Ah ja, da's inderdaad een goede tip! Gelijk even aanpassen dan maar... ;)

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.
 

Pagina: « vorige 1 2 3 4 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.