Re: [RFC] Shorter attribute syntax
| From: | Michał Brzuchalski | Date: | Wed, 10 Jun 2020 08:11:30 +0000 |
| Subject: | Re: [RFC] Shorter attribute syntax | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-110460@lists.php.net to get a copy of this message | ||
wt., 9 cze 2020 o 13:56 Benjamin Eberlei <kontakt@beberlei.de> napisał(a):
> On Thu, Jun 4, 2020 at 1:55 AM Theodore Brown <theodorejb@outlook.com>
> wrote:
>
> > Hi internals,
> >
> > I discussed the syntax for attributes further with Benjamin, Martin,
> > and several other internals developers off-list, and with their
> > feedback completed an RFC proposing to use the shorter
@@
> > syntax
> > instead of <<>> for attributes in PHP 8.
> >
> > https://wiki.php.net/rfc/shorter_attribute_syntax
> >
> > The goal is not to bikeshed over subjective syntax preferences,
> > but to address several concrete shortcomings related to verbosity,
> > nested attributes, confusion with generics and other tokens, and
> > dissimilarity to other common languages.
> >
>
> Larry's suggestion about #[Attr] makes an important argument about allowing
> to declare attributes in code in PHP 7 in a forward compatible way that has
> not been brought up before.
>
> /** @ORM\Entity */
> #[ORM\Entity]
> class User {}
>
> This code would work on PHP 7 and 8.
>
> The #[] syntax would have about equally low breaking potential as @@. It
> would be the same syntax as Rusts, and close to C++/C# syntax.
>
I just noticed a power of Rusts outer attributes which this syntax count
follow in a future.
Following outer attributes in Rust's we could introduce in a future syntax
like
<?php
#![StrictTypes,Module("my_module"),Opcache(save_comments: true)]
The last one used with recently proposed named arguments which could open a
wide range of possibilities IMO.
In Rust adding exclamation mark after hash #! imposes to take effect on
the outer scope which inside a file would be the whole file.
Going that path solution like that could possibly supersede declare
statement in a future and allow to add compile-time attributes
without breaking the language.
I believe this is very important because any attribute which is not
declared as a core and built-in is not taking an effect.
This way it'd be possible to add new ones in future PHP versions.
Even more with zend_ast_process it'd be possible to implement core
attributes which take effect on whole file in extension.
I can imagine this can possibly be discussed to allow attributes for eg.
from ctor to take effect on class but am not 100% sure of it is useful.
Going further with my imagination if we go that path with #[Attribute] we
may think of adding error suppression.
I know many don't like error-suppression but sometimes it's helpfull.
In case of core attributes I can imagine a const value can be added renamed
or removed, but the attribute remains the same
then adding error suppression in a future allows to avoid crashing like for
eg.
#@[Jit(Jit::OPTIMISE_SOMETHING)] // where the const may exists or not, but
the Jit attribute does
function foo () {}
In those cases we don't wanna crash the program, we may want it to continue
rather without proper optimisation then not at all.
I just see another use of current error-suppression operator @ to play nice
with attributes.
That's my 50 cents.
Best regards,
Michał Marcin Brzuchalski