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 {}

Reply via email to