ugrás a tartalomhoz

php annotáció

inf · 2013. Már. 23. (Szo), 11.33
Ti használtok annotációt php-ben?

Melyik engine-t ajánljátok? Nekem az jött le, hogy a doctrine common-ban lévő, ami jó, de kíváncsi vagyok, hátha van jobb is... Egyáltalán hogyan működnek ezek, futásidőben, vagy buildként?

A másik, hogy az annotációk kapcsán azt gondolom, hogy akkor jók, ha valami kimenne config fájlba, ami kihat a kód struktúrájára. Mondjuk ha a config fájlban egy osztály nevet, vagy egy metódus nevet adok meg, akkor szerencsésebb bizonyos esetekben, ha az a beállítás inkább az adott osztály vagy metódus mellett ott van annotációban. Jól gondolom?
 
2

Nem nagyon

complex857 · 2013. Már. 23. (Szo), 14.51
PHP -ban nincsenek olyan beépített annotationok mint java 1.5-óta az @Override, így ezek mindig 1-1 a projethez használt lib vagy eszköz okán kerülnek elő.
A PHP maga annyit tud segíteni, hogy Reflection -el vissza tudja adni a docblock commenteket stringként amit utána lehet parsolni az adott eszköznek, de ez (reflection úgy általában) nem valami gyors, illetve eaccelerator pl hajlamos megölni ezt az információt (ha nem --with-eaccelerator-doc-comment-inclusion -el lett forgatva), igy futásidőben nem tünik okos dolognak erre támaszkodni.
Másik lehetőség az, hogy tokenizer -el tokenenkét vegignyálazva forrásfileokat T_DOC_COMMENT után kutatva szerzi meg ezeket az információkat az adott eszköz.

Én a következőkhöz találtam hasznosnak őket:
  • Dokumentació: Azon túl, hogy konkrét api doksit a kód mellé lehet helyezni amiből utána phpdocumentor csinos kis doksit meg grafikonokat tud generálni, a külömbőző autocomplete engine-ek is hálásak ha 1-1 változórol meg tudod nekik mondani, hogy milyen típusú egy @var -al, vagy ha a __call() -al előállított "metodusokról" adsz neki listát @method -okkal. Legtöbb IDE megtanítható arra, hogy már megírt kódbol generáljon @param meg @return sorokat és utána csak at kell írni típusokat illetve leírást.

  • PHPUnit: A leghasznosabbnak talált (általam) annotation amit támogat a @group amivel pl futáskor ki tudok hagyni 1-1 tesztet (mert mondjuk külső service-al integrál), illetve amikor épp megírt de még nem futó tesztesetet akarom csak futtatni akkor mindig viszem magammal a "@group WIP" -t hogy ne kelljen commentezgetni azokat amiket most azonnal nem akarok futtatni. (igen, igen... ha rendesen izolált tesztjeim lennének amik gyorsan futnak, akkor nem kéne kihagyni korábbiakat :P)

Személy szerint én idegenkednék attól, hogy olyan metadatát rakjak ezekbe a commentekbe amiket az éles rendszer futás közben használ fel. A config fileokkal könnyebbnek tünik kezelni az egyes környezeti külömbségeket, ha php forrásfileok akkor van rájuk azonnal syntax ellenőrzés amit a commentek nem tudnak. Számomra nem tünik valószínűbbnek az sem, hogy commentekben lévő elévült dolgokat hamarabb észreveszem mint config fileokban levőket (ez lehet másnál máshogy van), főleg ha ezek szükségesek a kód működéséhez akkor az ilyen regressziókat kis szerencsével megfogják a tesztek.
4

Ez a kommentezés szerintem is

inf · 2013. Már. 23. (Szo), 15.00
Ez a kommentezés szerintem is marhaság, már régen a nyelv része kéne, hogy legyen, csak valamiért 2010-ben elvetették ezt az ötletet. A comment nekem abból a szempontból jó, hogyha törlöm az edott metódust, akkor a commentet is törlöm előle, így az annotációt is, ami benne van...
1

Doctrine

Práger Ádám · 2013. Már. 23. (Szo), 14.49
Hali!

Ahogy az előző hozzászóló is pedzegette, nem nagy dolog saját megoldást írni, de én a Doctrine megoldásást javaslom. Be tudod úgy állítni, hogy fejlesztői környezetben mindig újra beolvassa őket, productionben pedig cache is van. PHP-ba konvertál, dobsz rá egy APC-t, és a microtimeon kívül más nem mondja meg a különbséget.

Az hogy mikor használod csak rajtad múlik, de jól látod a problémát, a leírt helyzetben nem biztos hogy jó ötlet. Ha van egy adott osztályod, és mondjuk arra szeretnéd használni, hogy egy adott metódust megtalálj és meghívj, akkor jól jársz ezzel. Pl Lifecycle events az ORMben.

Ha viszont mondjuk egy olyat szeretnél csinálni vele, hogy megtalálj egy osztályt, akkor jobban jársz, ha configban tárolod el, ugyanis az annotation Reflectionből megy, és végig kell keresned az alkalmazásod osztályait, és beolvasni az annotációkat, így ez nem lesz gyors.
3

Ja, futásidőben nem jó ezzel

inf · 2013. Már. 23. (Szo), 14.57
Ja, futásidőben nem jó ezzel bajlódni, viszont ha lenne egy build, ami automatikusan legenerálja a config fájlt az annotációk alapján, az elég hasznos lenne... Azt hiszem írok egy ilyet.