On Wed, Jan 9, 2013 at 3:48 PM, Benjamin Eberlei <kont...@beberlei.de>wrote:
> On Wed, Jan 9, 2013 at 1:42 PM, Derick Rethans <der...@php.net> wrote: > >> Please, no top posting!!! >> >> On Wed, 9 Jan 2013, Vladislav Veselinov wrote: >> >> > Taken from the Doctrine documentation: >> > >> > <?php >> > class User >> > { >> > //... >> > /** >> > * @ManyToMany(targetEntity="Group") >> > * @JoinTable(name="User_Group", >> > * joinColumns={@JoinColumn(name="User_id", >> referencedColumnName="id")}, >> > * inverseJoinColumns={@JoinColumn(name="Group_id", >> referencedColumnName="id")} >> > * ) >> > */ >> > private $groups; >> > //... >> > } >> > >> > Not that I'm a fan of it, but it provides a valid usecase. I'm sure >> > there are more. >> >> Maybe valid, but sticking this into core-syntax seems mental. >> > > The Doctrine Syntax is verbose, because that is necessary to make up for > the missing compile time support in the language. > The core could easily offer a "simpler" language or one that looks more > like PHP code (array syntax). > > If you take a look at annotations by starting with PHP code, instead of > docblocks and the syntax optimized for that use-case you can end up with > something much simpler, see: > > The most simple type of annotations is attaching metadata to a class, > method, function, property. In Clojure this is actually done like this at > runtime setting a hashmap to any structure. > In PHP that would be something like: > > function foo() {} > > $refl = new ReflectionFunction('foo'); > $refl->setMetadata(array('foo' => 'bar')); > $refl->getMetadata(); > > Doctrine Annotations do allow "retrieving" metadata for any structure, > sspecified in docblocks. For seperation we need something the Annotations > RFC defined, a new type of docblock that is executable code wrapped in for > example <> brackets, if this were just PHP code, then we'd have: > > <return array('foo' => 'bar'))> > function foo() {} > > Now the difference between this syntax, and something resembling "Docblock > Annotations" would mean that the last statement between <> is returned from > the block. With short syntax for arrays we get: > > <['foo' => 'bar']> > function foo() {} > > Now this is nothing new to learn for anybody, except that <> code for any > structure can be "executed" using $reflection->getMetadata(); > > And the crazy people (like me) could do more structured things: > > use Doctrine\ORM\Mapping AS ORM; > > <[new ORM\Entity, new ORM\Table(name="user")]> > class User {} > The last two lines are wrong, must obviously be: <[new ORM\Entity, new ORM\Table(['name'=>"user"])]> class User {}