Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:93329 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 57590 invoked from network); 14 May 2016 11:49:05 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 14 May 2016 11:49:05 -0000 Authentication-Results: pb1.pair.com header.from=rasmus@mindplay.dk; sender-id=unknown Authentication-Results: pb1.pair.com smtp.mail=rasmus@mindplay.dk; spf=permerror; sender-id=unknown Received-SPF: error (pb1.pair.com: domain mindplay.dk from 209.85.218.48 cause and error) X-PHP-List-Original-Sender: rasmus@mindplay.dk X-Host-Fingerprint: 209.85.218.48 mail-oi0-f48.google.com Received: from [209.85.218.48] ([209.85.218.48:33899] helo=mail-oi0-f48.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 90/E0-48938-EA017375 for ; Sat, 14 May 2016 07:49:02 -0400 Received: by mail-oi0-f48.google.com with SMTP id k142so208077278oib.1 for ; Sat, 14 May 2016 04:49:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mindplay-dk.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=0/VMs7fzodZ10UQY6by1YGFpQQBAn436tVr2tk2UTgc=; b=PIk9qt6STXeULd+Lx52ZR6kKUBMmTB4CV5RtPc/WoZXco1QTb+faDm5SSaTRlqAW0r 2RAm55MxIFiW8e0SI/EBSupBTioF/kqSsUgwoKU0SC0EJwpEoqSyyDa+t81cUkQAm+kj +tHpMIyu8Ats/MvzO086ev93/PARHBR683ynqLfBQ9eS1pKru87ViRSa+LZAfWkFWVQJ W63ZE4v38yI5eeSKGMFe28LeTVTbyDvEAP/KhK/Kt4hpTfQr+m66u064JfBNeE83nNGm m/DQx+5xJxKLFqzwNfI9ANG0VYH4iP6+nBsASGv7bIRsXVJ6WU/D85n81NoWpEhbUhpO Xcag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=0/VMs7fzodZ10UQY6by1YGFpQQBAn436tVr2tk2UTgc=; b=JAcXZcNHqrVqsm9b1GgzMoUWGdlnkyfPdMpjfrlHiwsUkXiSW/vO5/SgLOcjwXmYnE l3y7fhoT++qXGzneUELjVkoqkre1/X8sbSNhAuQnlDYJQC5KPfWipRYdYzQpckzBMulW XbHUDateMBlVmjqzZT7H9cGpHgTV4LBWXXsLE0QpNJdQZma/T+kU8x8QA+f3fjBIK/Om dIjFseI0jtW2HlrTLechG6/LMfKiLCuVrITqU7ujAZuNNH6nHBrvou2BwL9ZhXjBhF2s vkj56f/HeV9vNfqBTP8tZgMBjzFl8KdGYzDexUGB1jjIXmYm7Lg5Z2TvFarbRWqwgxUo m8zQ== X-Gm-Message-State: AOPr4FWa1K76weGlwL2kA1wMhCbpHCQGwIM6OfFRX2PROK4Kngeo2fSV4e2O2M5z3r3g2ay8MB/KABDmQKf2yA== MIME-Version: 1.0 X-Received: by 10.157.54.249 with SMTP id s54mr12206760otd.59.1463226539552; Sat, 14 May 2016 04:48:59 -0700 (PDT) Received: by 10.157.44.214 with HTTP; Sat, 14 May 2016 04:48:59 -0700 (PDT) In-Reply-To: References: Date: Sat, 14 May 2016 13:48:59 +0200 Message-ID: To: Benjamin Eberlei Cc: PHP internals Content-Type: text/plain; charset=UTF-8 Subject: Re: [PHP-DEV] [RFC] Simple Annotations From: rasmus@mindplay.dk (Rasmus Schultz) 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. 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 wrote: > > > On Fri, May 13, 2016 at 2:11 PM, Rasmus Schultz 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 >> >