Annotations?
Annotations zijn stukjes extra informatie in je sourcecode die niet direct uitgevoerd worden maar als metadata aanwezig zijn. Een stukje commentaar is bijvoorbeeld een annotation; metadata die een beschrijving geeft van bijvoorbeeld een methode.
In een aantal imperatieve talen kunnen annotations ook gebruikt worden om functionaliteit toe te voegen aan een programma. De annotations kunnen worden uitgelezen door het programma dat ze kan gebruiken. Zo kan je stiekum declaratief programmeren in een imperatieve taal en dat is natuurlijk tof
Annotations in PHP
PHP heeft zelf geen native support voor annotations, maar er zit al wel een tijd lang een reflectie API in. Dat betekent dat je vanuit je script de structuur van je script kunt analyseren. Eén van de dingen die je ermee kan ophalen is de docblock van een gedocumenteerd element
. Die kan vervolgens verder uitgeplozen worden om er nuttig spul uit te halen en zo heb je annotations gefaked 
Das vast retetraag!
Dat vermoedde ik ook, maar een korte benchmark liet zien dat op mijn pc (Dothan 1.6Ghz), het ophalen van een docblock entry van een methode in een class van zo'n 30 methoden én het verwerken van de elementen in die docblock naar een array in 0.15 msec gedaan werd. Dat moet vlot genoeg zijn voor normaal gebruik
Maar het is wel ranzig!
Vind je? Vind ik ook wel een beetje, maar het is wel sexy
Voorbeeldje?
Stel je hebt een framework gemaakt waarbij sommige methoden ook aangeroepen moeten kunnen worden met een ajax request, dan kan je bijvoorbeeld zoiets doen:
Of wat dacht je van security:
Zo kan je methodes beveiligen met behulp van metadata; je framework kan vóórdat de methode aangeroepen wordt al kijken of de gebruiker wel de rechten 'edit' op het object 'user_admin' heeft
Of bijvoorbeeld voor validatieregels:
En hoe gebruik ik dat?
Je zou zoiets kunnen gebruiken om van een bepaalde methode de annotations te vinden.
Zo krijg je de annotations van een methode netjes in een associatieve array terug
Annotations zijn stukjes extra informatie in je sourcecode die niet direct uitgevoerd worden maar als metadata aanwezig zijn. Een stukje commentaar is bijvoorbeeld een annotation; metadata die een beschrijving geeft van bijvoorbeeld een methode.
In een aantal imperatieve talen kunnen annotations ook gebruikt worden om functionaliteit toe te voegen aan een programma. De annotations kunnen worden uitgelezen door het programma dat ze kan gebruiken. Zo kan je stiekum declaratief programmeren in een imperatieve taal en dat is natuurlijk tof
Annotations in PHP
PHP heeft zelf geen native support voor annotations, maar er zit al wel een tijd lang een reflectie API in. Dat betekent dat je vanuit je script de structuur van je script kunt analyseren. Eén van de dingen die je ermee kan ophalen is de docblock van een gedocumenteerd element
Das vast retetraag!
Dat vermoedde ik ook, maar een korte benchmark liet zien dat op mijn pc (Dothan 1.6Ghz), het ophalen van een docblock entry van een methode in een class van zo'n 30 methoden én het verwerken van de elementen in die docblock naar een array in 0.15 msec gedaan werd. Dat moet vlot genoeg zijn voor normaal gebruik
Maar het is wel ranzig!
Vind je? Vind ik ook wel een beetje, maar het is wel sexy
Voorbeeldje?
Stel je hebt een framework gemaakt waarbij sommige methoden ook aangeroepen moeten kunnen worden met een ajax request, dan kan je bijvoorbeeld zoiets doen:
PHP:
1
2
3
4
5
6
7
| /** * @remoteCallable true */ function getUser($id){ // do things return $user; } |
Of wat dacht je van security:
PHP:
1
2
3
4
5
6
7
| /** * @object user_admin * @action edit */ function updateUser($data){ //bla } |
Zo kan je methodes beveiligen met behulp van metadata; je framework kan vóórdat de methode aangeroepen wordt al kijken of de gebruiker wel de rechten 'edit' op het object 'user_admin' heeft
Of bijvoorbeeld voor validatieregels:
PHP:
1
2
3
4
5
6
7
| class User { /** * @validate /[a-z0-9-_]{6-20}/ * @unique */ public $username; } |
En hoe gebruik ik dat?
Je zou zoiets kunnen gebruiken om van een bepaalde methode de annotations te vinden.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
| function getAnnotations($class, $method){ $rmethod = new ReflectionMethod($class, $method); $comment = $rmethod->getDocComment(); preg_match_all('/@([a-z]+)\s(.*)/', $comment, $matches); $annotations = array(); for($i = 0; $i < count($matches[0]); $i++){ $key = $matches[1][$i]; $value = $matches[2][$i]; $annotations[$key] = $value; } return $annotations; } |
Zo krijg je de annotations van een methode netjes in een associatieve array terug