Re: Annotation RFC + Patch
| From: | Etienne Kneuss | Date: | Thu, 26 Aug 2010 13:54:49 +0000 |
| Subject: | Re: Annotation RFC + Patch | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-49543@lists.php.net to get a copy of this message | ||
Test, sorry for the noise.
On Aug 26 13:56:09, Etienne Kneuss wrote:
>
> ----- "Benjamin Eberlei" <kontakt@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.kaps@mohiva.com> wrote:
> > > On Thu, 26 Aug 2010 11:17:33 +0200, Benjamin Eberlei
> > <kontakt@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
>
--
Etienne Kneuss