V aktuálním projektu používám shodou náhod poslední variantu, a to právě kvůli Tebou popsaným výhodám. Není to ukecané, je to robustní a ve spojení s anotacemi to i leccos svede. Zneužívání reflexe mi ani tak moc nevadí, ale co mi vadí je plýtvání pamětí, ke kterému nejjednodušší implementace této myšlenky vede. Ono totiž když pak pracuješ s 20ti entitami a u každé potřebuješ nastavit například jednu položku, vznikne ti v paměti 20 instancí stejné property reflexe...
Tohle mi vadilo, a tak jsem to vyřešil takovou nadstavbou, která tyto property reflexe umí sdílet napříč instancemi stejných tříd. Bohužel je kód, který to řeší, kvůli absenci late static bindingu pro proměnné (http://blogs.neoseeker.com/tekmosis/5576-late-static-binding-of-variables-constants-in-php-5-3/) možná trochu haluz, ale na druhou stranu svůj účel plní dobře.
Mně osobně nenapadlo v PHP nic lepšího. Má kritéria jsou stručnost, robustnost, paměťová efektivnost a také aby to umožňovalo něco složitějšího... Budu nadšen, pokud sem někdo dorazí z nějakou lepší implementací. :) Takže v každém případě díky za článek!
Kdyby Tě zajímala má implementace, přístup k tomu mému zmíněnému aktuálnímu projektu máš. :)
Používám první variantu, ale nepovažuji ji za úplně šťastnout.
Podle mě tohle hodně závisí na tom, jakou architekturu bude mít aplikace. Když se budeš snažit přiblížit tomuhle
http://www.augi.cz/programovani/architektura-skalovatelnych-aplikaci/
tak ti nebude vznikat Anémický model, jak ho popisuje Fowler
http://martinfowler.com/bliki/AnemicDomainModel.html
protože ty gettery a settery nebudeš potřebovat.
Až přijdu na to, jak to zadrátovat do Nette a Doctrine tak dám vědět. A doufám v to samé od ostatních :)