Dan,

I've added a note about special annotations to the "future scope"
section, naming the memoization-annotation as an example.

Benjamin,

I don't think you mean "out of scope" of what 80% want, I think you
mean "beyond the scope"?

I think this will definitely cover what 80% want to achieve, and
possibly a lot more - possibly new and useful patterns that we can't
even predict.


On Sat, May 14, 2016 at 3:41 PM, Benjamin Eberlei <kont...@beberlei.de> wrote:
>
>
> On Sat, May 14, 2016 at 1:48 PM, Rasmus Schultz <ras...@mindplay.dk> wrote:
>>
>> Thank you for your comments!
>>
>> Benjamin,
>>
>> I have removed the comment about annotation expressions executing in
>> an empty closure, since this example was clearly confusing, and I have
>> tried to clarify the fact that annotation expressions execute in an
>> empty scope. To be clear, annotation expressions are *not* closures,
>> and they do not accept arguments - there is no reason to complicate
>> the concept of annotations by introducing an implied scope, when you
>> can introduce one explicitly, for example:
>>
>> class Validation {
>>     private $validate;
>>
>>     public function __construct(callable $validate) {
>>         $this->validate = $validate;
>>     }
>>
>>     public function validate($instance) {
>>         return call_user_func($this->validate, $instance);
>>     }
>> }
>>
>> << new Validation(function (User $user) { return false !==
>> filter_var($user->email, FILTER_VALIDATE_EMAIL); }) >>
>> class User {
>>     public $email;
>> }
>>
>> Of course, you could just as well do this with an interface - as it
>> the case with most examples I can think of.
>>
>> If you can think of a meaningful annotation that actually requires
>> context and can't be implemented in a better/safer/cleaner way with
>> abstraction, please post? I'd like to add an example, but really have
>> never seen one that can't be solved better without annotations.
>
>
> Every proposal before was about annotation/attributes as metadata for code.
> Your proposal makes them executable functions instead (nameless, attached to
> code blocks).
>
> I think this is just way out of scope of what the 80% want to achieve with
> this feature.
>>
>>
>> Marco,
>>
>> > Love the simplicity of the RFC, but I can already see people doing
>> > terrible things with it
>>
>> Every language lets you do terrible and great things - I don't believe
>> in putting up roadblocks and complicating the language that prevent
>> people from learning.
>>
>> > TBH, I'd rather just allow a constant array (with constant expressions
>> > only), and that would be good enough :-)
>>
>> I don't agree with the idea of crippling a language feature to prevent
>> beginners from making mistakes - when doing so would also prevent
>> static analysis and block experienced developers from doing useful
>> things with objects.
>>
>> Davey and Mathieu,
>>
>> Annotations can be "named" by using classes. Per the RFC, defining or
>> enforcing a rule about allowing only one instance of the same type, is
>> not a feature.
>>
>> Hack's memoize is an annotation for the language interpreter itself -
>> that's beyond the scope of this RFC, but could be implemented in the
>> future.
>>
>> Your third question is answered by the RFC here:
>>
>> > Annotation expressions are not evaluated until reflection is invoked,
>> > and are evaluated only once and internally memoized upon the first call to
>> > getAnnotations().
>>
>> Thank you for your input so far!
>>
>> The RFC is 0.2 with the last updates based on your feedback - I would
>> like to add a suitable case example for annotations that require
>> context before I'd say this RFC is 1.0.
>>
>> If anyone can point at a real case example using Doctrine Annotations
>> (or anything else) please do!
>>
>> Thanks,
>>   Rasmus
>>
>>
>> On Sat, May 14, 2016 at 4:38 AM, Benjamin Eberlei <kont...@beberlei.de>
>> wrote:
>> >
>> >
>> > On Fri, May 13, 2016 at 2:11 PM, Rasmus Schultz <ras...@mindplay.dk>
>> > wrote:
>> >>
>> >> Dear Internals,
>> >>
>> >> I'm announcing a simplified RFC for annotations:
>> >>
>> >> https://wiki.php.net/rfc/simple-annotations
>> >>
>> >> It's an alternative to the proposed Attributes RFC and the (2010)
>> >> Annotations RFC.
>> >>
>> >> I'm attempting with this to describe a feature that is closer to the
>> >> language than what is proposed by the Attributes RFC, by permitting
>> >> the use of any valid PHP expression as an annotation value.
>> >>
>> >> Where the Attributes RFC proposes new syntax for what is essentially
>> >> arrays, this proposal instead permits you to use actual arrays, e.g.
>> >> without inventing any new syntax. It also allows you to use values of
>> >> any other type, including objects. This makes the proposed feature
>> >> more immediately useful, with a minimal learning curve.
>> >
>> >
>> > The attributes RFC actually does not specific syntax or arrays, but
>> > either a
>> > scalar (number, string) or an ast\node.
>> >
>> > A proposal for arrays *would* actually be "closer to the language" as
>> > you
>> > describe it.
>> >
>> >> Compared with the old Annotations RFC (and Doctrine Annotations, etc.)
>> >> this proposal does not attempt to define or enforce any rules about
>> >> what annotations are, permitted usage, inheritance rules, etc. -
>> >> instead it adds a very simple language feature upon which the
>> >> community may choose to build (and evolve) facilities that implement
>> >> additional rules and logic.
>> >>
>> >> My hope is that, if we can agree on something very small and simple,
>> >> we can defer the more opinionated discussions about rules and logic to
>> >> the community.
>> >>
>> >> In my opinion, language features should be simple, and consistent with
>> >> the language - I believe the way to do that, is to avoid discussions
>> >> about how such as facility should be used, and instead focus on how it
>> >> should work. There is a lot of opinion built into the old Annotations
>> >> RFC, and into Doctrine - features that attempt to dictate how the
>> >> feature should be used. I don't believe the language should dictate
>> >> what is or isn't correct or appropriate use.
>> >>
>> >> Please review and comment.
>> >
>> >
>> > I see you took my question about context from the other thread and
>> > defined
>> > annotations to be context less.
>> > You should add to the RFC examples of what is happening, if you do
>> > access
>> > context, for example access to undefined variable notices:
>> >
>> > <<$x>>
>> > class Foo {}
>> >
>> > $refl = new ReflectionClass('Foo');
>> > var_dump($refl->getAttributes(Foo::class));
>> > // PHP Notice:  Undefined variable: x in Command line code on line 1
>> >
>> > Still this is imho a weak point of your RFC. You already stated that a
>> > "simplified annotation" the way you see it is the expression wrapped in
>> > a
>> > closure:
>> >
>> > function () {
>> >     return php-expression;
>> > }
>> >
>> > So if an annotation is a function/closure that belongs to its target
>> > (class,
>> > property, function, method, ...) then why wouldn't there be a way to
>> > specify
>> > arguments?
>> > The RFC should give an answer to that. The statement you add doesn't
>> > make
>> > sense without examples. How does dependency injection even work, when
>> > you
>> > don't have a context?
>> >
>> > "Annotations that do require context should explicitly ask for that
>> > context
>> > - for example, you could use an anonymous function, a callable, or an
>> > anonymous class, to provide context via dependency injection."
>> >
>> > greetings
>> > Benjamin
>> >
>> >>
>> >> Thanks,
>> >>   Rasmus Schultz
>> >>
>> >> --
>> >> 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

Reply via email to