Oh this is an elegant solution, didnt even cross my mind.
For larger sets of annotations this would require lots of use statements though, but it makes the aliasing very explicit indeed. On Thu, 26 Aug 2010 13:56:09 +0200 (CEST), Etienne Kneuss <col...@php.net> wrote: > ----- "Benjamin Eberlei" <kont...@beberlei.de> wrote: > >> That is true, arrays dont allow for aliasing of any kind if >> annotations >> have different meaning in different frameworks. >> With arrays you can at least use the one annotation for different >> purposes >> as long as these purposes don't define the same keys. >> >> With Objects however you always need aliasing. PHPUnit will want to >> have a >> PHPUnit_Annotation_ExpectedException class, not an ExceptionException >> class >> only. However nobody would want to write: >> >> [PHPUnit_Annotation_ExpectedException] >> >> So when including PHPUnit, the annotation classes would probably >> register >> themselves as alias. Using a prefix for the aliasing begs the question >> of >> how to find the real class, if you have 2 or more aliases defined. >> Iterate >> over them and check for existance? >> >> [ExpectedException] with many alises could be for example >> PHPUnit_Annotation_ExpectedException, or >> Doctrine\ORM\Mapping\ExceptedException or >> Symfony\Framework\Form\Annotation\ExpectedException. >> >> This sounds pretty expensive to me. So its probably better to have a >> map >> of alias => classname. But this is adding quite some management >> overhead, >> i.e. you need methods: >> >> ReflectionAnnotation::registerAlias($alias, $className); >> ReflectionAnnotation::hasAlias($alias); >> ReflectionAnnotation::getAliases(); >> ReflectionAnnotation::getAliasClass($alias); >> ReflectionAnnotation::getAliasFor($className); >> >> Now say you have a library X with an Annotation aliased Bar (and you >> also >> use Framework Y with Annotation aliaased Bar). >> >> [Bar] >> class Foo >> { >> >> } > > I don't understand why aliasing of class names suddenly becomes an issue, > we now have namespaces which allow aliases. > > use NS\To\MyAnnotation as MyAnnot; > > [MyAnnot] > class Foo { > > } > > there is no need to have this aliasing mechanism at runtime as it will > only add more inconsistency to the plate. > > Best, > >> >> You call inside your library: >> >> $cls = new ReflectionClass($className); >> $annotations = $cls->getAnnotations(); >> >> What will happen if: >> >> 1. The annotation classes are not loaded yet. >> 2. Only the annotation classes of your library are loaded. >> 3. Both annotation classes are loaded. >> >> On Thu, 26 Aug 2010 13:12:13 +0200, Christian Kaps >> <christian.k...@mohiva.com> wrote: >> > On Thu, 26 Aug 2010 11:17:33 +0200, Benjamin Eberlei >> <kont...@beberlei.de> >> > wrote: >> >> Hey, >> >> >> >> 3. >> >> Ok that point may be relevant, but there is also a semantically >> nice >> and >> >> simple solution: >> >> >> >> array('JoinTable' => array( >> >> 'name' => 'users_phonenumbers', >> >> 'joinColumns' => array( >> >> 0 => array('JoinColumn' => array('name' => 'user_id', >> >> 'referencedColumnName => 'id')), >> >> 1 => array('JoinColumn' => array('name' => 'user_id', >> >> 'referencedColumnName => 'id')), >> >> ) >> >> )); >> >> >> > >> > [JoinTable( >> > name="users_phonenumbers", >> > joinColumns={ >> > {JoinColumn={name="user_id", referencedColumnName="id"}}, >> > {JoinColumn={name="user_id", referencedColumnName="id"}} >> > } >> > )] >> > >> > I think this gives you the same array structure as in your example >> but >> it >> > uses no nested annotations. >> > >> >> >> >> 5. You already mentioned further extensions with aliasing class >> names >> to >> >> "shorten" >> >> the annotations specification. However i see several problems with >> that: >> >> >> >> a.) It adds more code >> >> b.) Classes/Methods/Functions/Properties that have annotations of >> > multiple >> >> annotation libraries >> >> will cause pain with loading or autoloading of the necessary >> annotation >> >> classes. >> >> c.) What happens if an annotation has no corresponding class? >> >> >> > >> > You write that the developers should implement her complex class >> based >> > solution in userland. How would you handle aliasing for classes >> there? >> > Anywhere I must define the alias or the namespace of the annotation >> class, >> > otherwise I must register all annotations(annotation name => fully >> > qualified class name) used in my application before using them. >> Using >> > annotations from different frameworks with the same name makes this >> a >> pain. >> > >> > Greetings, >> > Christian >> >> -- >> PHP Internals - PHP Runtime Development Mailing List >> To unsubscribe, visit: http://www.php.net/unsub.php -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php