get('key') of __get ?
Ik betrap me erop dat ik de laatste tijd steeds meer de magische __set en __get functies aan het gebruiken ben, terwijl ik dat vroeger nooit deed. Ik wist toen ook nog niet hoe het werkte.
Inmiddels begin ik een soort "liefde" te voelen voor die 2 magische functies en ik ben benieuwd of jullie ze ook gebruiken, en zo ja... gebruik je ze dan af en toe, of vaak, of altijd?
Waarom ik het graag gebruik heeft 2 redenen. Ik vind het mooier: ik doe liever dit $path = $paths->mypath dan dit $path = $paths->getPath('mypath'). De 2e reden is dat ik in plaats van 10 verschillende get functies nog maar 1 functie nodig heb. Nu ben ik benieuwd of er dus meer mensen zijn die vaak van de __set en __get functie gebruik maken. Ik zie zelf alleen maar voordelen, maar wellicht zijn er ook nadelen aan het gebruik van de __set en __get functies? Kortom, ik ben benieuwd hoe jullie met deze functies omgaan en of jullie ze vaak gebruiken.
Leesvoer, vooral de "What’s broken?" sectie.
Lang verhaal kort - magie gaat ten koste van duidelijkheid.
Niet gebruiken. Lang verhaal kort - magie gaat ten koste van duidelijkheid.
Zijn er nog meer mensen die regelmatig de __get en __set functie gebruiken? Ik neem aan dat ik toch niet de enige ben?
Ik gebruik het niet vaak. Dit omdat je dan totaal geen controle meer hebt over welke properties readable en welke niet readable zijn. Je maakt ze in feite allemaal readable, iets waarvan ik niet hou.
Stel je wil in je controller aangeven welk css bestand gebruikt moet worden. Je kan dan zoiets doen als dit: $this->setCssFile('main.css');
Maar je kan het ook via de __set functie doen:
$this->css = 'main.css';
Dit vind ik wel chique.
In de __set functie zou je den een switch op de key kunnen maken. Als de key css is dan wordt het bestand opgeslagen in de private property $_css_files.
Dat is een beetje wat ik bedoel.
Ander voorbeeld, stel jij typt deze url in: www.wouterj.nl/ik/ben/wouter
Wouter zou nu het argument zijn dat hoort bij de parameter "naam".
Als je nu in de controller zit en je wilt de naam opvragen, dan zou je dat zo kunnen doen:
$naam = $this->getParameter('naam');
Maar hoe mooi is het als je gewoon dit kunt doen:
$naam = $this->naam;
Ik vraag me dus af of er meer mensen zijn die op deze manier werken. Ik vind het namelijk wel chique, overzichtelijk en handig.
Ozzie PHP op 31/03/2012 14:08:08:
Hmmm... de 2 "nadelen" zoals die staan beschreven is dat het traag zou zijn (zelf nooit gemerkt) en dat auto-aanvullen niet werkt. Dat laatste kan zo zijn, maar ervaar ik zelf niet als lastig.
Ozzie PHP op 31/03/2012 14:24:29:
In de __set functie zou je den een switch op de key kunnen maken. Als de key css is dan wordt het bestand opgeslagen in de private property $_css_files.
Daar ga je al, zodra je in __set gaat checken op keys wordt het allemaal nog langzamer. Dat je dat niet merkt is een zinloze opmerking, natuurlijk merk je het verschil niet tussen 50ms ipv 5ms, maar toch is het verschil 900%. En als je dat je hele applicatie door doet, wordt het verschil wél merkbaar.
Zodra je je bezig gaat houden met TDD zal je merken dat de magic methods niet werken. En auto aanvullen is erg belangrijk, zeker als je iets als een API Reference wil genereren. Genoeg redenen lijkt me zo.
Gewijzigd op 31/03/2012 18:41:14 door Mark PHP
Ik zeg ook niet dat je het overal zou moeten toepassen, maar op sommige plakken is het wel heel handig. (Wat is TDD?)
TDD is Test Driven Development, dit wordt in PHP vaak gedaan door Unit Testing in samenwerking met PHPUnit. TDD is een geweldig goede manier om tot een applicatie te komen, Symfony is hier bijv. door opgebouwd.
Ah, oke... thanks.