Hi,
Out of Banjamin's suggestion[1], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:
https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
FWIW, this has an excemption from the RM Sara as per [2]:
- Shorter Attribute Syntax Change
- Joe/Derick - Please make sure this RFC moves along and reaches
conclusion by beta3, as discussed previously.
cheers,
Derick
[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286
--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug
A little nitpick but I don't think that @@
really signals familiarity
with docblocks.
Nevertheless, I really like @[...]
. I think it combines best of the both
worlds (little-to-no BC breaks, ending delimiter, etc.) and also looks
aesthetically pleasing.
Best regards,
Benas
Hi,
Out of Banjamin's suggestion[1], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
FWIW, this has an excemption from the RM Sara as per [2]:
- Shorter Attribute Syntax Change
- Joe/Derick - Please make sure this RFC moves along and reaches
conclusion by beta3, as discussed previously.cheers,
Derick[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug--
To unsubscribe, visit: https://www.php.net/unsub.php
Hi,
Out of Banjamin's suggestion[1], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
FWIW, this has an excemption from the RM Sara as per [2]:
- Shorter Attribute Syntax Change
- Joe/Derick - Please make sure this RFC moves along and reaches
conclusion by beta3, as discussed previously.
In combination to the existing proposals we already voted one, this RFC
includes a fourth option that has not been discussed before,
and could be the compromise we are all looking for :-)
@[Attr] combines both the with to use the familiar @ of many, and the wish
to have a closing symbol/termination symbol that many others have.
It does not have the downsides that Tyson found w.r.t. to #[Attr] being
interpreted as comment on PHP 7, but that also means its not forward
compatible like #[Attr] is.
It provides a small BC break where code written as @[$foo, $bar] = baz();
or $foo = @["bar" => $baz]; will not compile on PHP 8 anymore, but that can
be easily
fixed by writing it with a space between @ and [.
cheers,
Derick[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug--
To unsubscribe, visit: https://www.php.net/unsub.php
Suggestions:
$(Attribute()) (available)
$[Attribute()] (available)
<<Attribute(1 >> 2)>> (like strings escapes)
About $() syntax:
- Number of required characters: (2+1)
- Has end delimiter: yes
- Allow grouping: yes
- Forward compatibility in PHP 7: yes
- Breaks BC of valid PHP 7 codes: no
- Used by other languages: no?
- Familiar with Docblock Usage: I don't know
- Difficulties with Userland Parsers: I don't know
And my another suggestion is use a more verbose for now, until we have a
good consensus about it "using attribute()":
- Number of required characters: (16+1)
- Has end delimiter: yes
- Allow grouping: yes
- Forward compatibility in PHP 7: yes
- Breaks BC of valid PHP 7 codes: no
- Used by other languages: no?
- Familiar with Docblock Usage: I don't know
- Difficulties with Userland Parsers: I don't know
Atenciosamente,
David Rodrigues
Em ter., 4 de ago. de 2020 às 11:03, Benjamin Eberlei kontakt@beberlei.de
escreveu:
Hi,
Out of Banjamin's suggestion[1], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
FWIW, this has an excemption from the RM Sara as per [2]:
- Shorter Attribute Syntax Change
- Joe/Derick - Please make sure this RFC moves along and reaches
conclusion by beta3, as discussed previously.In combination to the existing proposals we already voted one, this RFC
includes a fourth option that has not been discussed before,
and could be the compromise we are all looking for :-)@[Attr] combines both the with to use the familiar @ of many, and the wish
to have a closing symbol/termination symbol that many others have.It does not have the downsides that Tyson found w.r.t. to #[Attr] being
interpreted as comment on PHP 7, but that also means its not forward
compatible like #[Attr] is.It provides a small BC break where code written as @[$foo, $bar] = baz();
or $foo = @["bar" => $baz]; will not compile on PHP 8 anymore, but that can
be easily
fixed by writing it with a space between @ and [.cheers,
Derick[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug--
To unsubscribe, visit: https://www.php.net/unsub.php
On Tue, Aug 4, 2020 at 4:19 PM David Rodrigues david.proweb@gmail.com
wrote:
Suggestions:
$(Attribute()) (available)
$[Attribute()] (available)
<<Attribute(1 >> 2)>> (like strings escapes)
The syntax for the first two seems oddly pleasing when used within PHP.
On Tue, Aug 4, 2020 at 4:19 PM David Rodrigues david.proweb@gmail.com
wrote:
Suggestions:
$(Attribute()) (available)
$[Attribute()] (available)
<<Attribute(1 >> 2)>> (like strings escapes)
I had someone else suggest $[] to me today as well, funny coincidence :-)
Can you take the "@@ to @[] pull" request as a starting point to try if
this works with a patch?
https://github.com/php/php-src/pull/5928
This syntax is "not" familiar with docblock usage of @, as it doesn't
contain a @ :-D
It does pose difficulty for static analyers and userland parsers, because
they see the $ as a T_VARIABLE
in PHP 7.
About $() syntax:
- Number of required characters: (2+1)
- Has end delimiter: yes
- Allow grouping: yes
- Forward compatibility in PHP 7: yes
- Breaks BC of valid PHP 7 codes: no
- Used by other languages: no?
- Familiar with Docblock Usage: I don't know
- Difficulties with Userland Parsers: I don't know
And my another suggestion is use a more verbose for now, until we have a
good consensus about it "using attribute()":
Number of required characters: (16+1)
Has end delimiter: yes
Allow grouping: yes
Forward compatibility in PHP 7: yes
Breaks BC of valid PHP 7 codes: no
Used by other languages: no?
Familiar with Docblock Usage: I don't know
Difficulties with Userland Parsers: I don't know
This would definitely need a fully working patch to be a contender in the
vote.
- It's not forward compatibltle with PHP 7, because use of the syntax
would lead to a fatal error on PHP 7 parsers or am I seeing something
wrong? - its not a familiar syntax for PHP developers used to @ in docblocks
Atenciosamente,
David RodriguesEm ter., 4 de ago. de 2020 às 11:03, Benjamin Eberlei kontakt@beberlei.de
escreveu:Hi,
Out of Banjamin's suggestion[1], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
FWIW, this has an excemption from the RM Sara as per [2]:
- Shorter Attribute Syntax Change
- Joe/Derick - Please make sure this RFC moves along and reaches
conclusion by beta3, as discussed previously.In combination to the existing proposals we already voted one, this RFC
includes a fourth option that has not been discussed before,
and could be the compromise we are all looking for :-)@[Attr] combines both the with to use the familiar @ of many, and the wish
to have a closing symbol/termination symbol that many others have.It does not have the downsides that Tyson found w.r.t. to #[Attr] being
interpreted as comment on PHP 7, but that also means its not forward
compatible like #[Attr] is.It provides a small BC break where code written as @[$foo, $bar] = baz();
or $foo = @["bar" => $baz]; will not compile on PHP 8 anymore, but that
can
be easily
fixed by writing it with a space between @ and [.cheers,
Derick[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug--
To unsubscribe, visit: https://www.php.net/unsub.php
It provides a small BC break where code written as @[$foo, $bar] = baz();
or $foo = @["bar" => $baz]; will not compile on PHP 8 anymore, but that can
be easily
fixed by writing it with a space between @ and [.If those are the potential breaks we're choosing between, I would favor
#[...] as it provides strong forward-compatibility to drive adoption and
use at the cost of a parse error that's easily fixed (even programmatically
with a very simple script). @[...] provides no forward compat with a
roughly equal chance of easily fixed syntax break.
Given that, the choice seems obvious to me.
Change my mind?
-Sara
It provides a small BC break where code written as @[$foo, $bar] =
baz(); or $foo = @["bar" => $baz]; will not compile on PHP 8
anymore, but that can be easily fixed by writing it with a space
between @ and [.If those are the potential breaks we're choosing between, I would
favor #[...] as it provides strong forward-compatibility to drive
adoption and use at the cost of a parse error that's easily fixed
(even programmatically with a very simple script). @[...] provides no
forward compat with a roughly equal chance of easily fixed syntax
break.Given that, the choice seems obvious to me. Change my mind?
I pretty much agree, but @[ … ] is there as a compromise as it does show
some fmailiarity with the already existing @ in doc blocks.
cheers,
Derick
--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug
Hi,
Am 04.08.20 um 15:45 schrieb Derick Rethans:
Patches and comments welcome.
if the syntax will be changed to having a closing delimiter, I would
really like to have symmetrical delimiters, like @{ }@ or something like
that. ] as a closing delimiter just seems to collide with the array
syntax and does not provide much parsing benefit to me.
Greets
Dennis
Am 04.08.2020 um 15:45 schrieb Derick Rethans:
This is probably a wiki/markup issue: the RFC shows "«Attr»" instead of
"<<Attr>>" for the original syntax.
Am 04.08.2020 um 15:45 schrieb Derick Rethans:
This is probably a wiki/markup issue: the RFC shows "«Attr»" instead
of "<<Attr>>" for the original syntax.
Given that every single thread about attributes contains an email like
the above, no matter what we end up with I will be glad if it's not
<<Attr>>.
Best,
Jordi
--
Jordi Boggiano
@seldaek - https://seld.be
Out of Banjamin's suggestion1, I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
Hi Derick,
I don't agree with the main argument put forward in this RFC:
The main concern is that @@ has no ending symbol and it's
inconsistent with the language that it would be the only
declaration or statement in the whole language that has no ending
termination symbol.
Attributes are not a standalone statement or declaration; they are
metadata on a declaration. They cannot stand alone, but always
modify the following declaration, just as public and static modify
a method, or a type declaration modifies a parameter or property.
Modifying declarations (e.g. for visibility and type) do not have an
ending symbol. For example, we don't write something like:
[public] function foo([int] $bar) {}
With the @@ syntax attributes a treated consistently with type and
visibility declarations:
@@Jit
public function foo(@@Deprecated int $bar) {}
So there is nothing inconsistent about not having a termination
symbol - this is in harmony with visibility and type declarations in
PHP, as well as the attribute syntax used by a majority of C family
languages. 1
When it comes to supporting attribute grouping, I actually consider
this a downside of the #[], @[], and <<>> syntaxes. It complicates
the internal implementation, and makes it so developers have to
choose between two different syntaxes when adding more than one
attribute. In real-world use cases the @@ syntax is just as or even
more concise without the extra parser/compiler complexity:
#[Attr1, Attr2] # 15 chars
@@Attr1 @@Attr2 # 15 chars
# 4 lines, 53 chars not counting whitespace
@[
AttrWithParam("foobar"),
SomeOtherAttr("fizzbuzz"),
]
# 2 lines, 52 chars
@@AttrWithParam("foobar")
@@SomeOtherAttr("fizzbuzz")
I agree that we want the best syntax, not necessarily the best
looking syntax. I still believe that the @@ syntax offers the best
balance here. It's familiar, concise without additional complexity,
and doesn't break useful syntax the way @[] and #[] do.
Kind regards,
Theodore
Hi Derick,
Hi Derick,
I don't agree with the main argument put forward in this RFC:
The main concern is that @@ has no ending symbol and it's
inconsistent with the language that it would be the only
declaration or statement in the whole language that has no ending
termination symbol.Attributes are not a standalone statement or declaration; they are
metadata on a declaration. They cannot stand alone, but always
modify the following declaration, just as public and static modify
a method, or a type declaration modifies a parameter or property.Modifying declarations (e.g. for visibility and type) do not have an
ending symbol. For example, we don't write something like:[public] function foo([int] $bar) {}
With the @@ syntax attributes a treated consistently with type and
visibility declarations:@@Jit
public function foo(@@Deprecated int $bar) {}So there is nothing inconsistent about not having a termination
symbol - this is in harmony with visibility and type declarations in
PHP, as well as the attribute syntax used by a majority of C family
languages. [1]When it comes to supporting attribute grouping, I actually consider
this a downside of the #[], @[], and <<>> syntaxes. It complicates
the internal implementation, and makes it so developers have to
choose between two different syntaxes when adding more than one
attribute. In real-world use cases the @@ syntax is just as or even
more concise without the extra parser/compiler complexity:#[Attr1, Attr2] # 15 chars
@@Attr1 @@Attr2 # 15 chars
# 4 lines, 53 chars not counting whitespace
@[
AttrWithParam("foobar"),
SomeOtherAttr("fizzbuzz"),
]# 2 lines, 52 chars
@@AttrWithParam("foobar")
@@SomeOtherAttr("fizzbuzz")I agree that we want the best syntax, not necessarily the best
looking syntax. I still believe that the @@ syntax offers the best
balance here. It's familiar, concise without additional complexity,
and doesn't break useful syntax the way @[] and #[] do.Kind regards,
Theodore
I agree with Theodore's points, including that this is metadata on a declaration, not a declaration itself.
This RFC has proposed that the lack of a closing delimiter might get in the way of future language changes,
but has not given examples of hypothetical syntax extensions that would cause future conflict
and that it'd be impossible to resolve/avoid the ambiguity.
(e.g. Java has managed with @AttributeName
and optional arguments in parameters, classes, properties, methods, etc.)
PHP already has a lot of places where there is no closing delimiter, even where you'd want/expect one,
so I wouldn't call a lack of closing delimiter unique.
e.g. the below example is parsed as clone((new stdClass())->foo)
,
because parenthesis aren't part of clone
.
php > clone(new stdClass())->foo;
Notice: Undefined property: stdClass::$foo in php shell code on line 1
Warning: Uncaught Error: __clone method called on non-object in php shell code:1
Thanks,
- Tyson
I agree with Theodore's points, including that this is metadata on a declaration, not a declaration itself.
Is this technically true? I haven't peeked at the grammar. I suspect
it is a declaration and not an optional piece of data on a
declaration, like say public
.
On Tue, Aug 4, 2020 at 8:59 PM Levi Morrison
levi.morrison@datadoghq.com wrote:
I agree with Theodore's points, including that this is metadata on a declaration, not a declaration itself.
Is this technically true? I haven't peeked at the grammar. I suspect
it is a declaration and not an optional piece of data on a
declaration, like saypublic
.
I meant to say "statement", e.g.
I suspect it is a statement and not an optional piece of data on a
statement, like say public
.
Hi Theodore,
I meant to say "statement", e.g.
I suspect it is a statement and not an optional piece of data on a
statement, like saypublic
.
I assume this would boil down to a disagreement on what we mean by statement, and could be clarified by using whatever that definition was instead of "statement" or "declaration".
For example, I might broadly mean that there are expressions, statements, and statement lists in PHP, and statements can be a certain list of node types composed of statements/expressions/nodes (plus standalone expressions), expressions can contain expressions or statement lists, but not statements. (and statement lists can contain 0 or more statements)
(e.g. closures are expressions)
- And then there are nodes that are parts of statements/expressions but neither statements nor expressions, such as parameter declarations
- The php language specification is more complicated than that and my definition would inevitably be over-simplifying, the definition I'd meant was https://github.com/php/php-langspec/blob/master/spec/11-statements.md
By statement, I'd be referring to what parsers generally categorize as statements.
For example, the list of nodes in https://github.com/nikic/PHP-Parser/tree/master/lib/PhpParser/Node/Stmt
- This has changed in the past, e.g. the "throw expression" RFC.
- Still, I'd believe the attributes would be metadata associated with a class statement, a method/function statement, a parameter node, or a closure declaration expression
Regards,
- Tyson
I agree with Theodore's points, including that this is metadata on a
declaration, not a declaration itself.Is this technically true? I haven't peeked at the grammar. I suspect
it is a declaration and not an optional piece of data on a
declaration, like saypublic
.
IMO this is irrelevant anyway. An attribute isn't just a keyword like
public, or int. It is only an attribute because it preceded by a
specific token; this makes it not just a declaration.
cheers,
Derick
--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug
On Tue, Aug 4, 2020 at 6:37 PM Theodore Brown theodorejb@outlook.com
wrote:
Out of Banjamin's suggestion[1], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
Hi Derick,
I don't agree with the main argument put forward in this RFC:
The main concern is that @@ has no ending symbol and it's
inconsistent with the language that it would be the only
declaration or statement in the whole language that has no ending
termination symbol.Attributes are not a standalone statement or declaration; they are
metadata on a declaration. They cannot stand alone, but always
modify the following declaration, just as public and static modify
a method, or a type declaration modifies a parameter or property.Modifying declarations (e.g. for visibility and type) do not have an
ending symbol. For example, we don't write something like:[public] function foo([int] $bar) {}
With the @@ syntax attributes a treated consistently with type and
visibility declarations:@@Jit public function foo(@@Deprecated int $bar) {}
So there is nothing inconsistent about not having a termination
symbol - this is in harmony with visibility and type declarations in
PHP, as well as the attribute syntax used by a majority of C family
languages. [1]
Attributes are potentially way more complex than a visibility keyword. As
such it is a reasonable requirement to say they should have a unified
ending symbol, or more broadly speaking that attributes should be enclosed
by syntax.
It looks nice for a simple attribute like @@Jit, or for a one without
arguments like the used @@Deprecated, but as soon as there are more than
one, and they each get arguments, enclosing them has its own benefits over
them just standing for themselves.
When it comes to supporting attribute grouping, I actually consider
this a downside of the #[], @[], and <<>> syntaxes. It complicates
the internal implementation, and makes it so developers have to
choose between two different syntaxes when adding more than one
attribute. In real-world use cases the @@ syntax is just as or even
more concise without the extra parser/compiler complexity:#[Attr1, Attr2] # 15 chars @@Attr1 @@Attr2 # 15 chars # 4 lines, 53 chars not counting whitespace @[ AttrWithParam("foobar"), SomeOtherAttr("fizzbuzz"), ] # 2 lines, 52 chars @@AttrWithParam("foobar") @@SomeOtherAttr("fizzbuzz")
I agree that we want the best syntax, not necessarily the best
looking syntax. I still believe that the @@ syntax offers the best
balance here. It's familiar, concise without additional complexity,
and doesn't break useful syntax the way @[] and #[] do.
Yes, we have been doing this for 20 years, adding annotations enclosed with
/** and */ with each enclosing on its own line for the most part. We even
added stars in front of every inbetween line.
we are stepping into unchartered territory here with @@ by our standards as
PHP community. Using "C familiy" as an argument that they made @ work does
not mean much, because the language itself is just the "interface" to the
implementation, each C family language probably has vastly different
parsers, concerns and approaches. It should be right for PHP.
Kind regards,
Theodore[1]:
https://wiki.php.net/rfc/shorter_attribute_syntax#comparison_to_other_languagesTo unsubscribe, visit: https://www.php.net/unsub.php
It looks nice for a simple attribute like @@Jit, or for a one without
arguments like the used @@Deprecated, but as soon as there are more than
one, and they each get arguments, enclosing them has its own benefits over
them just standing for themselves.
The confusing thing about this argument is that as soon as they have
arguments, attributes will have an ending delimiter whatever syntax we
choose, because nobody has ever proposed removing the parentheses around
the arguments.
Detecting the closing parenthesis requires pairing off any parentheses
inside the argument list, but that's still true of the closing bracket in
@[...]. If we make the closing delimiter some random combination like @#]]
then you still need to parse the arguments, because they could contain a
quoted string with those characters in.
While I'm generally in favour of delimited syntaxes, I'm struggling to see
the difference in value between "parentheses are mandatory even if there
are zero arguments" and "the syntax includes an extra pair of outer
brackets".
With no parameters:
@@Foo()
@(Foo)
@[Foo]
@[Foo]@
With complex parameters:
@@Foo('hello @@ world', (1+2)*3)
@(Foo('hello @@ world', (1+2)*3))
@[Foo('hello @[ world ]', [1,2,3])]
@[Foo('hello @[ world ]@ again', [1,2,3])]@
Regards,
Rowan Tommins
[IMSoP]
It looks nice for a simple attribute like @@Jit, or for a one
without arguments like the used @@Deprecated, but as soon as there
are more than one, and they each get arguments, enclosing them has
its own benefits over them just standing for themselves.The confusing thing about this argument is that as soon as they have
arguments, attributes will have an ending delimiter whatever syntax
we choose, because nobody has ever proposed removing the parentheses
around the arguments.
The syntax that would start it (@@) is not the same, or related to the
parenthesis that follow the attribut name ( () ). They are not linked,
as the ( in () is opening a 'context' and the ) in )) is closing it
again. This is not the ending syntax of '@@'.
cheers,
Derick
--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug
The confusing thing about this argument is that as soon as they have
arguments, attributes will have an ending delimiter whatever syntax
we choose, because nobody has ever proposed removing the parentheses
around the arguments.The syntax that would start it (@@) is not the same, or related to the
parenthesis that follow the attribut name ( () ). They are not linked,
as the ( in () is opening a 'context' and the ) in )) is closing it
again. This is not the ending syntax of '@@'.
I'm sorry, I don't understand what you mean here. Are you saying that there
is some practical difference - for parsers, for human readers, or something
else - between the grammars below?
"@@", attribute-name, "(", expression-list, ")"
vs
"@(", attribute-name, "(", expression-list, "))"
Regards,
Rowan Tommins
[IMSoP]
Out of Banjamin's suggestion[1], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
Hi Derick,
I don't agree with the main argument put forward in this RFC:
The main concern is that @@ has no ending symbol and it's
inconsistent with the language that it would be the only
declaration or statement in the whole language that has no ending
termination symbol.Attributes are not a standalone statement or declaration; they are
metadata on a declaration. They cannot stand alone, but always
modify the following declaration, just as public and static modify
a method, or a type declaration modifies a parameter or property.Modifying declarations (e.g. for visibility and type) do not have an
ending symbol. For example, we don't write something like:[public] function foo([int] $bar) {}
With the @@ syntax attributes are treated consistently with type and
visibility declarations:@@Jit public function foo(@@Deprecated int $bar) {}
So there is nothing inconsistent about not having a termination
symbol - this is in harmony with visibility and type declarations in
PHP, as well as the attribute syntax used by a majority of C family
languages. [1]Attributes are potentially way more complex than a visibility keyword.
As such it is a reasonable requirement to say they should have a
unified ending symbol, or more broadly speaking that attributes should
be enclosed by syntax.
Hi Benjamin,
Yes, attributes that take arguments are more complex than a
visibility keyword. Union types can also be more complex.
Nevertheless it is consistent for these declaration modifiers to
not have an ending symbol.
It looks nice for a simple attribute like @@Jit, or for a one without
arguments like the used @@Deprecated, but as soon as there are more
than one, and they each get arguments, enclosing them has its own
benefits over them just standing for themselves.
Can you clarify what benefits there are to enclosing them as soon as
there is more than one attribute with arguments? From my perspective
this just adds needless complexity without being more concise than
the @@ syntax.
To me it also looks somewhat strange and less readable to require
both a closing parenthesis and a closing bracket when an attribute
has arguments:
#[MyAttr(
"some value",
[1, 2, 3],
namedArg: true,
)]
# vs.
@@MyAttr(
"some value",
[1, 2, 3],
namedArg: true,
)
When it comes to supporting attribute grouping, I actually consider
this a downside of the #[], @[], and <<>> syntaxes. It complicates
the internal implementation, and makes it so developers have to
choose between two different syntaxes when adding more than one
attribute. In real-world use cases the @@ syntax is just as or even
more concise without the extra parser/compiler complexity:#[Attr1, Attr2] # 15 chars @@Attr1 @@Attr2 # 15 chars # 4 lines, 53 chars not counting whitespace @[ AttrWithParam("foobar"), SomeOtherAttr("fizzbuzz"), ] # 2 lines, 52 chars @@AttrWithParam("foobar") @@SomeOtherAttr("fizzbuzz")
I agree that we want the best syntax, not necessarily the best
looking syntax. I still believe that the @@ syntax offers the best
balance here. It's familiar, concise without additional complexity,
and doesn't break useful syntax the way @[] and #[] do.Yes, we have been doing this for 20 years, adding annotations enclosed
with /** and */ with each enclosing on its own line for the most part.
We even added stars in front of every inbetween line.we are stepping into unchartered territory here with @@ by our
standards as PHP community. Using "C familiy" as an argument that
they made @ work does not mean much, because the language itself is
just the "interface" to the implementation, each C family language
probably has vastly different parsers, concerns and approaches. It
should be right for PHP.
I agree that we should pick the syntax that is right for PHP. But how
are the #[] and @[] alternatives a better fit for the language than
@@, given that they break useful syntax, while @@ isn't useful for
anything?
It seems like on the one hand the RFC is arguing that @@ is worse
because that exact token isn't used by another language, and on the
other hand it is simultaneously being argued that we need to
implement a more verbose syntax for adding vague complexity in
the future that isn't used by any other language. Which is it?
A less vague potential extension is attribute nesting, and @@ is
arguably the best fit for this - one of the motivations for proposing
it was to allow attribute nesting while preserving readable code and
a simple internal implementation.
Best regards,
Theodore
A new suggestion: @attr(...). It could be used on future for other syntaxes
and should be supersedes the error supression. So will be a BC exclusively
for @attr() error supression for attr() function. But it is few verbose and
easy to understand. With error supression remotion (9.0?) it could be used
for other new features easily.
Em qua, 5 de ago de 2020 13:46, Theodore Brown theodorejb@outlook.com
escreveu:
On Wed, Aug 5, 2020 at 7:20 AM Benjamin Eberlei kontakt@beberlei.de
wrote:Out of Banjamin's suggestion[1], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
Hi Derick,
I don't agree with the main argument put forward in this RFC:
The main concern is that @@ has no ending symbol and it's
inconsistent with the language that it would be the only
declaration or statement in the whole language that has no ending
termination symbol.Attributes are not a standalone statement or declaration; they are
metadata on a declaration. They cannot stand alone, but always
modify the following declaration, just as public and static modify
a method, or a type declaration modifies a parameter or property.Modifying declarations (e.g. for visibility and type) do not have an
ending symbol. For example, we don't write something like:[public] function foo([int] $bar) {}
With the @@ syntax attributes are treated consistently with type and
visibility declarations:@@Jit public function foo(@@Deprecated int $bar) {}
So there is nothing inconsistent about not having a termination
symbol - this is in harmony with visibility and type declarations in
PHP, as well as the attribute syntax used by a majority of C family
languages. [1]Attributes are potentially way more complex than a visibility keyword.
As such it is a reasonable requirement to say they should have a
unified ending symbol, or more broadly speaking that attributes should
be enclosed by syntax.Hi Benjamin,
Yes, attributes that take arguments are more complex than a
visibility keyword. Union types can also be more complex.
Nevertheless it is consistent for these declaration modifiers to
not have an ending symbol.It looks nice for a simple attribute like @@Jit, or for a one without
arguments like the used @@Deprecated, but as soon as there are more
than one, and they each get arguments, enclosing them has its own
benefits over them just standing for themselves.Can you clarify what benefits there are to enclosing them as soon as
there is more than one attribute with arguments? From my perspective
this just adds needless complexity without being more concise than
the @@ syntax.To me it also looks somewhat strange and less readable to require
both a closing parenthesis and a closing bracket when an attribute
has arguments:#[MyAttr( "some value", [1, 2, 3], namedArg: true, )] # vs. @@MyAttr( "some value", [1, 2, 3], namedArg: true, )
When it comes to supporting attribute grouping, I actually consider
this a downside of the #[], @[], and <<>> syntaxes. It complicates
the internal implementation, and makes it so developers have to
choose between two different syntaxes when adding more than one
attribute. In real-world use cases the @@ syntax is just as or even
more concise without the extra parser/compiler complexity:#[Attr1, Attr2] # 15 chars @@Attr1 @@Attr2 # 15 chars # 4 lines, 53 chars not counting whitespace @[ AttrWithParam("foobar"), SomeOtherAttr("fizzbuzz"), ] # 2 lines, 52 chars @@AttrWithParam("foobar") @@SomeOtherAttr("fizzbuzz")
I agree that we want the best syntax, not necessarily the best
looking syntax. I still believe that the @@ syntax offers the best
balance here. It's familiar, concise without additional complexity,
and doesn't break useful syntax the way @[] and #[] do.Yes, we have been doing this for 20 years, adding annotations enclosed
with /** and */ with each enclosing on its own line for the most part.
We even added stars in front of every inbetween line.we are stepping into unchartered territory here with @@ by our
standards as PHP community. Using "C familiy" as an argument that
they made @ work does not mean much, because the language itself is
just the "interface" to the implementation, each C family language
probably has vastly different parsers, concerns and approaches. It
should be right for PHP.I agree that we should pick the syntax that is right for PHP. But how
are the #[] and @[] alternatives a better fit for the language than
@@, given that they break useful syntax, while @@ isn't useful for
anything?It seems like on the one hand the RFC is arguing that @@ is worse
because that exact token isn't used by another language, and on the
other hand it is simultaneously being argued that we need to
implement a more verbose syntax for adding vague complexity in
the future that isn't used by any other language. Which is it?A less vague potential extension is attribute nesting, and @@ is
arguably the best fit for this - one of the motivations for proposing
it was to allow attribute nesting while preserving readable code and
a simple internal implementation.Best regards,
TheodoreTo unsubscribe, visit: https://www.php.net/unsub.php
With error supression remotion (9.0?) it could be used
for other new features easily.
Just to re-iterate something that I'm pretty sure has been said before:
the chance of removing the error suppression operator in PHP 9.0 is
approximately zero, and the chance of immediately re-using it is
significantly lower.
We haven't even begun to design the replacement APIs that would make it
unnecessary, e.g. atomic file access. Once those are in place, users
need time to migrate to them before we could even start the deprecation
and removal process.
Opportunities that might, depending on a whole bunch of other factors,
come in PHP 10.0 or 11.0 are probably not a strong argument for a syntax
option.
Regards,
--
Rowan Tommins (né Collins)
[IMSoP]
With error supression remotion (9.0?) it could be used for other new
features easily.Just to re-iterate something that I'm pretty sure has been said
before: the chance of removing the error suppression operator in PHP
9.0 is approximately zero, and the chance of immediately re-using it
is significantly lower.
Hear hear.
cheers,
Derick
--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug
#[Attr1, Attr2] # 15 chars @@Attr1 @@Attr2 # 15 chars # 4 lines, 53 chars not counting whitespace @[ AttrWithParam("foobar"), SomeOtherAttr("fizzbuzz"), ] # 2 lines, 52 chars @@AttrWithParam("foobar") @@SomeOtherAttr("fizzbuzz")
Shall I do one where we count pixels? Because @@ is using a lot more of
them... And there is also no reason why it can't be just:
@[AttrWithParam("foobar")]
@[SomeOtherAttr("fizzbuzz")]
Although group is allowed, it doesn't mean it's always useful to do.
@@Attr1 @@Attr2
Seems to me like a cat had trespassed on your keyboard, the heavy @@
also dominates the line.
I agree that we want the best syntax, not necessarily the best
looking syntax. I still believe that the @@ syntax offers the best
balance here.
From the RFC:
- No ending delimiter
- Doesn't allow grouping
- No forwards compat with PHP 7
- Not used ny another language
And the "familiar with docblocks" is quite a stretch, as that doesn't
use @@ either. I've only included it because it would be unfair if @@
had nothing positive going for it.
cheers,
Derick
Le Thu, 6 Aug 2020 07:48:05 +0100 (BST),
Derick Rethans derick@php.net a écrit :
From the RFC:
- No ending delimiter
As said before, it does have an ending delimiter when they are arguments since
there is the parenthesis around them. When there are no arguments I don’t see
the benefit of an ending delimiter, it’s easy to spot the end of the word.
- Doesn't allow grouping
I do not understand this argument, what is the point of grouping for @@?
Does grouping mean anything special for other syntaxes, or is it just to save
keystrokes? If it is just to get a more concise syntax when there are several
attributes, the fact that @@ do not need grouping is a pro, not a con.
- No forwards compat with PHP 7
But no BC break either, while #[] introduces BC break.
- Not used ny another language
@ is used by a lot of other languages, and @@ is the closest we can get in PHP.
Côme
On Thu, 6 Aug 2020 at 08:18, Côme Chilliet <
come.chilliet@fusiondirectory.org> wrote:
As said before, it does have an ending delimiter when they are arguments
since
there is the parenthesis around them. When there are no arguments I don’t
see
the benefit of an ending delimiter, it’s easy to spot the end of the word.
And if needed, make the parenthesis required. So @@Foo is illegal,
but @@Foo() is allowed.
Required parenthesis is familiar to most PHP programmers (functions,
classes following common coding conventions) - what's not to like?
Using "^" in the code demonstrations below as no one has proposed it and my
point isn't about #, << or @@ we get:
^Foo(
^Bar(43, "raa")
)
vs
^[Foo(
^[Bar(43, "raa")]
)]
To me the former is significantly more pleasant to read.
Is it difficult to parse?
Peter
On Thu, Aug 6, 2020, 10:18 AM Côme Chilliet <
come.chilliet@fusiondirectory.org> wrote:
Le Thu, 6 Aug 2020 07:48:05 +0100 (BST),
Derick Rethans derick@php.net a écrit :From the RFC:
- No ending delimiter
As said before, it does have an ending delimiter when they are arguments
since
there is the parenthesis around them. When there are no arguments I don’t
see
the benefit of an ending delimiter, it’s easy to spot the end of the word.
Ending delimiter MAY help us in the future.
I really, really hate all of those arguments stating "that we should care
only about the present, not the future" and that even though
#[...]
/@[...]
might bring benefits in the future, we should still
choose @@
".
This shows clearly that some people are basing their views on subjective
reasons rather than being objective.
As far as this discussion is going, I see pro-@@
people just saying
"Arghhh, let's keep @@, it doesn't bring any benefits that other syntaxes
do but we don't need them anyways, let's not speculate future".
It's like saying you can either go through door A and get a free car or
through door B and get the same car and maybe, even an additional
1,000$.
We are playing probabilities here but at the moment, no one has said any
substantial argument why @@
is better and thus, @[...]
seems like a
better option in the long term.
- Doesn't allow grouping
I do not understand this argument, what is the point of grouping for @@?
Does grouping mean anything special for other syntaxes, or is it just to
save
keystrokes? If it is just to get a more concise syntax when there are
several
attributes, the fact that @@ do not need grouping is a pro, not a con.
No, it is not a pro. It's a matter of personal taste. You are basing your
opinion on subjective views which goes against this RFC's principles - to
choose a syntax that is the best based on the benefits it offers.
- No forwards compat with PHP 7
But no BC break either, while #[] introduces BC break.
Not true, technically speaking both @@
and #[]
have a BC break. Albeit
@@
has a smaller one.
But by sacrificing a few very old codebases (that still use #
not //
),
we are making sure that we won't run into any parsing problems in the
future. And this is far more important.
- Not used ny another language
@ is used by a lot of other languages, and @@ is the closest we can get in
PHP.
This is a pointless argument.
[...]
/[[...]]
is also used by a lot of languages, #[...]
and @[...]
is the closest we can get to that.
Heck, @[...]
is the closest to both @
and [...]
.
Best regards,
Benas
But by sacrificing a few very old codebases (that still use
#
not//
)
Do you have some basis for # only being used by "very old" codebases? As
far as I'm aware, it's not deprecated, and while the PEAR style guide
listed it as "discouraged", PSR-1 / 2 / 12 don't mention it at all.
I agree that it is probably rarer than //... and /.../ but let's avoid
unnecessary hyperbole.
Regards,
Rowan Tommins
[IMSoP]
A grep search was done by someone in the mailing list in the original
<<...>>
to @@...
RFC thread when discussing whether #[
is going
to be a huge BC or not.
Just about all of the matches were either from old codebases or from
old PHP 3-5 Metasploit exploits, which are about 5-15 years old.
Best regards,
Benas
P.S: I accidentally sent this to Rowan only, so forwarding this to the
mailing list as well.
But by sacrificing a few very old codebases (that still use
#
not//
)Do you have some basis for # only being used by "very old" codebases? As
far as I'm aware, it's not deprecated, and while the PEAR style guide
listed it as "discouraged", PSR-1 / 2 / 12 don't mention it at all.I agree that it is probably rarer than //... and /.../ but let's avoid
unnecessary hyperbole.Regards,
Rowan Tommins
[IMSoP]
But by sacrificing a few very old codebases (that still use
#
not//
)Do you have some basis for # only being used by "very old" codebases? As
far as I'm aware, it's not deprecated, and while the PEAR style guide
listed it as "discouraged", PSR-1 / 2 / 12 don't mention it at all.I agree that it is probably rarer than //... and /.../ but let's avoid
unnecessary hyperbole.
A grep search was done by someone in the mailing list in the original
<<...>>
to@@...
RFC thread when discussing whether#[
is going
to be a huge BC or not.Just about all of the matches were either from old codebases or from
old PHP 3-5 Metasploit exploits, which are about 5-15 years old.
Hi Benas,
You can look at the grep search here: https://grep.app/search?q=%23%5B&filter[lang][0]=PHP
The first BC break in the results is from an automated pentest
framework repository which was last updated four days ago. So it
seems like this is still code that is being used.
Even the current Psalm static analysis tests use # to comment out an
array: https://github.com/vimeo/psalm/blob/afce2dc66ff83ccad3f3a7aa26740a5eb829b2ca/tests/LanguageServer/SymbolLookupTest.php#L453
Not that these individual examples are a big problem, they simply
illustrate that hash comments are still used in current projects,
sometimes in ways that the #[] attribute syntax would break.
When it comes to the @[] alternative, it's harder to grep for actual
usages, since this string is used in virtually every email validation
regex. In any case, code like @[foo(), bar()] would no longer work
without putting a space between the error suppression operator and
array (which frankly looks pretty confusing):
$x =
@ [Foo()]; // an array assignment with suppressed warnings
@[Jit()] // an attribute
function bar() {}
If there were some important language improvement that depended on
breaking these syntaxes, maybe it would be justified. But so far I
haven't seen such a justification.
We are playing probabilities here but at the moment, no one has said
any substantial argument why@@
is better and thus,@[...]
seems
like a better option in the long term.
While none of our syntax options are perfect, I believe @@ has the best
long-term tradeoffs because:
- It doesn't break useful syntax
- It is equally or more concise than grouped attributes without adding
complexity to the parser/compiler - It offers a clean, simple way to support nested attributes in the
future if we so desire - It is conceptually closest to the docblock syntax the PHP community
is familiar with - It is aligned with the attribute semantics of the majority of C
family languages
Best regards,
Theodore
Hey Theodore,
On Thu, Aug 6, 2020 at 5:24 AM Benas IML benas.molis.iml@gmail.com
wrote:On Thu, 6 Aug 2020 at 11:45, Rowan Tommins rowan.collins@gmail.com
wrote:On Thu, 6 Aug 2020 at 09:12, Benas IML benas.molis.iml@gmail.com
wrote:But by sacrificing a few very old codebases (that still use
#
not
//
)Do you have some basis for # only being used by "very old" codebases?
As
far as I'm aware, it's not deprecated, and while the PEAR style guide
listed it as "discouraged", PSR-1 / 2 / 12 don't mention it at all.I agree that it is probably rarer than //... and /.../ but let's
avoid
unnecessary hyperbole.A grep search was done by someone in the mailing list in the original
<<...>>
to@@...
RFC thread when discussing whether#[
is going
to be a huge BC or not.Just about all of the matches were either from old codebases or from
old PHP 3-5 Metasploit exploits, which are about 5-15 years old.Hi Benas,
You can look at the grep search here:
https://grep.app/search?q=%23%5B&filter[lang][0]=PHPThe first BC break in the results is from an automated pentest
framework repository which was last updated four days ago. So it
seems like this is still code that is being used.
I work myself in the cybersecurity industry and I can tell you 100% that
the automated pentesting tool you're referring to isn't using any of that
#[
code actively. In fact, over 80% of the code/exploits stored in that
repository don't work with new software/language versions.
That's the whole point - there are hundreds of scripts in numerous
different languages designed for exploiting only specific subset of
software designed for only specific versions of PHP/other languages.
By 5-15 years, I meant the exploits themselves.
Even the current Psalm static analysis tests use # to comment out an
Not that these individual examples are a big problem, they simply
illustrate that hash comments are still used in current projects,
sometimes in ways that the #[] attribute syntax would break.
...and that can be fixed within 5 seconds.
#
comments were even deprecated in PHP's ini files in 5.6.
When it comes to the @[] alternative, it's harder to grep for actual
usages, since this string is used in virtually every email validation
regex. In any case, code like @[foo(), bar()] would no longer work
without putting a space between the error suppression operator and
array (which frankly looks pretty confusing):$x = @ [Foo()]; // an array assignment with suppressed warnings @[Jit()] // an attribute function bar() {}
Same goes without saying with @@
where @@
means attributes and @ @
means double error suppression. Albeit, that is not useful.
If there were some important language improvement that depended on
breaking these syntaxes, maybe it would be justified. But so far I
haven't seen such a justification.We are playing probabilities here but at the moment, no one has said
any substantial argument why@@
is better and thus,@[...]
seems
like a better option in the long term.While none of our syntax options are perfect, I believe @@ has the best
long-term tradeoffs because:
- It doesn't break useful syntax
Fair enough.
- It is equally or more concise than grouped attributes without adding
complexity to the parser/compiler
Are we really going to debate that ~30 lines of code add complexity?
- It offers a clean, simple way to support nested attributes in the
future if we so desire
I'm sorry if I'm not following the conversation but what is blocking that
in #[]
/@[]
.
- It is conceptually closest to the docblock syntax the PHP community
is familiar with
Well, if @@
is similar to @
(to me it isn't), we can say that @[]
is
also similar to @
.
- It is aligned with the attribute semantics of the majority of C
family languages
In what way #[]
or @[]
aren't?
Best regards,
Theodore
Best regards,
Benas
Hey Theodore,
While none of our syntax options are perfect, I believe @@ has the
best long-term tradeoffs because:
- It doesn't break useful syntax
Fair enough.
- It is equally or more concise than grouped attributes without
adding complexity to the parser/compilerAre we really going to debate that ~30 lines of code add complexity?
Hi Benas,
I don't know how many lines of code it will be, since an
implementation for it has never been finished. The patch currently
linked in the RFC does not implement it.
Even if we assume the implementation is only about 30 lines, it's
still extra complexity that I don't understand the benefit of. I
sincerely would like to know what advantage there is of grouped
attributes over the @@
syntax.
-
It is equally or more verbose than
@@
in real-world use cases -
Adding or removing a second attribute with grouping can require
modifying multiple lines, adding unnecessary noise to diffs:@@SomeAttribute("value") @@AnotherAttribute("value") # can be added/removed independently function foo() {} # vs. @[SomeAttribute("value")] # changes to: @[ SomeAttribute("value"), AnotherAttribute("value"), # not added/removed independently ] function foo() {}
-
How much more added complexity will the grouped syntax require if
we add nested attributes in the future? At the least it will have to
be special-cased in some way, either to disallow grouping for nested
attributes or to treat the grouped syntax the same as an array.
@@
avoids the need for additional complexity, special cased syntax,
and having to modify extra lines when adding/removing separate
attributes.
- It is conceptually closest to the docblock syntax the PHP
community is familiar withWell, if
@@
is similar to@
(to me it isn't), we can say that
@[]
is also similar to@
.
I would agree that @[]
is more similar than #[]
is. But arguably
@@
is still the closest since docblock annotations don't require
being wrapped in array brackets.
- It is aligned with the attribute semantics of the majority of C
family languagesIn what way
#[]
or@[]
aren't?
The majority of C family languages use @Attr
without an extra end
symbol. This makes sense since attributes are simply metadata
modifying the declaration that follows them, similar to visibility
and type declarations.
Best regards,
Theodore
On Fri, Aug 7, 2020 at 2:24 AM Theodore Brown theodorejb@outlook.com
wrote:
On Thu, Aug 6, 2020 at 12:30 PM Benas IML benas.molis.iml@gmail.com
wrote:Hey Theodore,
On Thu, Aug 6, 2020, 8:05 PM Theodore Brown theodorejb@outlook.com
wrote:While none of our syntax options are perfect, I believe @@ has the
best long-term tradeoffs because:
- It doesn't break useful syntax
Fair enough.
- It is equally or more concise than grouped attributes without
adding complexity to the parser/compilerAre we really going to debate that ~30 lines of code add complexity?
Hi Benas,
I don't know how many lines of code it will be, since an
implementation for it has never been finished. The patch currently
linked in the RFC does not implement it.
Curious what brings you to claim an implementation has never been finished
when it was accepted by RFC vote?
Grouping certainly has a finished implementation, Martin and I had it
working for the original RFC, then when we removed it for the original vote
had a working patch and PR as part of the Amendments RFC.
I now ported the patch to the @[] syntax PR here:
https://github.com/php/php-src/pull/5928/commits/c69e2de26c42c583a8ca0fa579c1be69d40bfc454
The zend_compile.c diff looks a bit complex, but it's really only 5 new
lines for a new for loop over the groups and all existing code one level
deeper.
All in all the attribute grouping patch adds 26 new lines (and then tests)
all restricted within the existing attribute parser rules and the functions
compiling attribute code. This adds no complexity at all.
Even if we assume the implementation is only about 30 lines, it's
still extra complexity that I don't understand the benefit of. I
sincerely would like to know what advantage there is of grouped
attributes over the@@
syntax.
- It is equally or more verbose than
@@
in real-world use cases
You keep bringing up verbosity like our primary language design goal is to
reduce it, PHP is the most verbose language I know. Everything in PHP
requires more characters than in other languages. Keywords are usually
long, variables need an extra $ in front. You have
to use $this-> as no implicit context exists. Functions need to be prefixed
by "array_", "str_" instead of methods on the objects.
The primary design goal of a language construct in PHP is not to reduce
verbosity.
Adding or removing a second attribute with grouping can require
modifying multiple lines, adding unnecessary noise to diffs:@@SomeAttribute("value") @@AnotherAttribute("value") # can be added/removed independently function foo() {} # vs. @[SomeAttribute("value")] # changes to: @[ SomeAttribute("value"), AnotherAttribute("value"), # not added/removed independently ] function foo() {}
- How much more added complexity will the grouped syntax require if
we add nested attributes in the future? At the least it will have to
be special-cased in some way, either to disallow grouping for nested
attributes or to treat the grouped syntax the same as an array.
@@
avoids the need for additional complexity, special cased syntax,
and having to modify extra lines when adding/removing separate
attributes.
- It is conceptually closest to the docblock syntax the PHP
community is familiar withWell, if
@@
is similar to@
(to me it isn't), we can say that
@[]
is also similar to@
.I would agree that
@[]
is more similar than#[]
is. But arguably
@@
is still the closest since docblock annotations don't require
being wrapped in array brackets.
But docblocks are wrapped in /** */, enclosing the whole declaration of
them.
Both @[] and #[] are comparable with /** */ as metadata boundary. The
attribute
itself has no symbol prefixes or alike, it's just the class name.
This is a very close translation to how docblocks with userland doc-params
work,
in my opinion this makes all enclosed syntaxes much more in line with
existing syntax,
regardless of symbols used.
- It is aligned with the attribute semantics of the majority of C
family languagesIn what way
#[]
or@[]
aren't?The majority of C family languages use
@Attr
without an extra end
symbol. This makes sense since attributes are simply metadata
modifying the declaration that follows them, similar to visibility
and type declarations.Best regards,
TheodoreTo unsubscribe, visit: https://www.php.net/unsub.php
Hey Theodore,
While none of our syntax options are perfect, I believe @@ has the
best long-term tradeoffs because:
- It doesn't break useful syntax
Fair enough.
- It is equally or more concise than grouped attributes without
adding complexity to the parser/compilerAre we really going to debate that ~30 lines of code add complexity?
Hi Benas,
I don't know how many lines of code it will be, since an
implementation for it has never been finished. The patch currently
linked in the RFC does not implement it.Curious what brings you to claim an implementation has never been
finished when it was accepted by RFC vote?Grouping certainly has a finished implementation, Martin and I had it
working for the original RFC, then when we removed it for the original
vote had a working patch and PR as part of the Amendments RFC.
Hi Benjamin,
Apologies, I didn't realize the grouped attribute implementation was
completely finished before. When it was dropped from the Attribute
Amendments pull request, a bunch of other changes still had to be
made before it was ready to merge, and I assumed that some changes
would have also been required for attribute grouping. Thank you for
the correction.
I now ported the patch to the @[] syntax PR here: [updated link]
https://github.com/php/php-src/pull/5928/commits/597688fd5b0a41d23028454b62ba25f950f35a16
The zend_compile.c diff looks a bit complex, but it's really only 5
new lines for a new for loop over the groups and all existing code
one level deeper.All in all the attribute grouping patch adds 26 new lines (and then
tests) all restricted within the existing attribute parser rules and
the functions compiling attribute code. This adds no complexity at all.
This is some new complexity, even if only a small amount right now.
My question remains about how much more added complexity it will
require later if we implement extensions like nested attributes.
Even if we assume the implementation is only about 30 lines, it's
still extra complexity that I don't understand the benefit of. I
sincerely would like to know what advantage there is of grouped
attributes over the@@
syntax.
- It is equally or more verbose than
@@
in real-world use casesYou keep bringing up verbosity like our primary language design goal
is to reduce it, PHP is the most verbose language I know. Everything
in PHP requires more characters than in other languages. Keywords are
usually long, variables need an extra $ in front. You have to use
$this-> as no implicit context exists. Functions need to be prefixed
by "array_", "str_" instead of methods on the objects.
Yes, PHP has historically been rather verbose in some ways.
Thankfully this has been gradually changing, with the short array
syntax added in 5.4, and more recently short arrow functions,
constructor property promotion, and the match expression having an
explicit goal to reduce verbosity.
The primary design goal of a language construct in PHP is not to
reduce verbosity.
What is the goal of the grouped attribute construct? I still haven't
received an answer about what makes it better than @@
.
@@
avoids the need for additional complexity, special cased syntax,
and having to modify extra lines when adding/removing separate
attributes.
- It is conceptually closest to the docblock syntax the PHP
community is familiar withWell, if
@@
is similar to@
(to me it isn't), we can say that
@[]
is also similar to@
.I would agree that
@[]
is more similar than#[]
is. But arguably
@@
is still the closest since docblock annotations don't require
being wrapped in array brackets.But docblocks are wrapped in /** */, enclosing the whole declaration
of them.Both @[] and #[] are comparable with /** */ as metadata boundary.
The attribute itself has no symbol prefixes or alike, it's just the
class name.This is a very close translation to how docblocks with userland
doc-params work, in my opinion this makes all enclosed syntaxes much
more in line with existing syntax, regardless of symbols used.
Aren't docblock annotations only wrapped in /** */ because they have to
be inside a comment? There is no need for this with the native
attribute syntax. To me, the #[]
and @[]
tokens don't at all look
similar to docblock comment boundaries, anyway.
Best regards,
Theodore
This is some new complexity, even if only a small amount right now.
My question remains about how much more added complexity it will
require later if we implement extensions like nested attributes.
What? Are you actually saying that 30 lines of code add "complexity"? I
think you should look more at the PHP source code before going to these
nonsensical conclusions. PHP is a fully fledged language, not a "let's
write the shortest code possible" competition.
As for the nested attributes, you can implement those with simple
recursion. You are trying to create problems here that don't exist.
Yes, PHP has historically been rather verbose in some ways.
Thankfully this has been gradually changing, with the short array
syntax added in 5.4, and more recently short arrow functions,
constructor property promotion, and the match expression having an
explicit goal to reduce verbosity.
No offense intended but saying that 1 extra character somehow adds
verbosity is quite honestly, one of the stupidest things I have heard.
While we at it, let's also rename other keywords: function
to f
,
while
to w
and static
to s
. You know, to save those few extra
characters.
What is the goal of the grouped attribute construct? I still haven't
received an answer about what makes it better than@@
.
You can't compare attribute syntax against attribute feature. You better
tell me why @@
is better than @[]
using arguments and not with "boo, I
have to type 1 extra character with @[]
".
As for the grouped attributes. Why do we allow grouped properties and class
constants? It's alternative code style that some might prefer.
Aren't docblock annotations only wrapped in /** */ because they have to
be inside a comment? There is no need for this with the native
attribute syntax. To me, the
#[]
and@[]
tokens don't at all look
similar to docblock comment boundaries, anyway.
Even more so with @@
, which look nothing alike to docblocks. Just because
docblock annotations contain the same character as attribute syntax, it
doesn't magically mean "it's like docblocks". Because if so, @[]
looks
far far more like docblocks than @@
.
Best regards,
Theodore
Best regards,
Benas
While none of our syntax options are perfect, I believe @@ has the
best long-term tradeoffs because:
- It doesn't break useful syntax
Fair enough.
- It is equally or more concise than grouped attributes without
adding complexity to the parser/compilerAre we really going to debate that ~30 lines of code add complexity?
I don't know how many lines of code it will be, since an
implementation for it has never been finished. The patch currently
linked in the RFC does not implement it.Even if we assume the implementation is only about 30 lines, it's
still extra complexity that I don't understand the benefit of. I
sincerely would like to know what advantage there is of grouped
attributes over the@@
syntax.
It was very specifically voted for:
https://wiki.php.net/rfc/attribute_amendments#group_statement_for_attributes1
The complexity is minimal:
https://github.com/php/php-src/pull/5928/commits/597688fd5b0a41d23028454b62ba25f950f35a16
And most of the change is just indentation.
You still haven't addressed any of the deficiencies that the other
alternatives don't have:
https://wiki.php.net/rfc/shorter_attribute_syntax_change#proposal
I would agree that
@[]
is more similar than#[]
is. But arguably
@@
is still the closest since docblock annotations don't require
being wrapped in array brackets.
They're instead wrapped in /** … */ though, which also acts like a
grouping structure.
- It is aligned with the attribute semantics of the majority of C
family languagesIn what way
#[]
or@[]
aren't?The majority of C family languages use
@Attr
without an extra end
symbol.
PHP isn't C though—hack, C has a function 'creat()', so that argument
doesn't really mean much.
cheers,
Derick
--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug
You still haven't addressed any of the deficiencies that the other
alternatives don't have:
https://wiki.php.net/rfc/shorter_attribute_syntax_change#proposal
That table would be a lot more useful to steer the discussion if it was
accompanied by an explanation of each of the factors, as some of them are
extremely vague:
- Do the three "Yes"es in the "Difficulties with Userland Parsers" relate
to the same problem? What is it specifically, and how does <<Foo>> avoid
it? Is it really true that <<Foo>> has no difficulties for userland
parsers, or just that it avoids that particular problem? - "Number of required characters" is the number for a single, ungrouped
attribute. The number of characters saved by grouped attributes would be a
more useful measure than just whether they're possible. - There is no explanation of why end delimiters are an important factor.
- If it is important, my question before stands as to why "@@Attr()" with
mandatory parentheses wouldn't receive a "Yes" in this row. - "Familiar with Docblock Usage" seems to be rather subjective; is it the
"@" that makes it familiar? the lack of extra brackets? I'm not sure it's
fair to boil this down to a straight yes/no. - "Tokens Used" seems to be an implementation detail, with no explanation
of why this would make a difference to anyone's vote.
Regards,
Rowan Tommins
[IMSoP]
Even if we assume the implementation is only about 30 lines, it's
still extra complexity that I don't understand the benefit of. I
sincerely would like to know what advantage there is of grouped
attributes over the@@
syntax.It was very specifically voted for:
https://wiki.php.net/rfc/attribute_amendments#group_statement_for_attributes
Hi Derick,
It was specifically voted for the <<>>
syntax, with the explicit
qualification that "This feature would be superseded by any other RFC
getting accepted that changes the syntax." This is exactly what
happened when the Shorter Attribute Syntax RFC was accepted.
You still haven't addressed any of the deficiencies that the other
alternatives don't have:
https://wiki.php.net/rfc/shorter_attribute_syntax_change#proposal
I'm not sure which deficiencies you mean, but let's briefly go
through the table in the RFC to make sure nothing has been missed:
-
Number of required Characters:
-
@@
has the advantage here.
-
-
Has End Delimiter:
- This isn't clearly a pro or a con in itself.
-
Allows Grouping:
- As discussed before,
@@
has the advantage of being equally
concise without this added complexity.
- As discussed before,
-
Forward Compatibility in PHP 7:
- This is at best a temporary benefit of
#[]
which will be
irrelevant in a few years, at worst a source of confusion and bugs
when code intended for PHP 8 runs on PHP 7 with different results.
- This is at best a temporary benefit of
-
Breaks BC of valid PHP 7 code:
- All syntaxes but
<<>>
technically have a BC break. There really
should be a separate line in the table for "Breaks useful syntax",
since#[]
and@[]
have this deficiency, but@@
does not.
- All syntaxes but
-
Used by other language:
-
This is listed as an advantage for
#[]
and<<>>
. However, the table
fails to point out that Hack is migrating away from<<>>
to@Attr
.
Furthermore, while#[]
has the same start/end symbols as Rust, the rest
of the grammar/semantics vary significantly. E.g. these are valid Rust
attributes (see https://doc.rust-lang.org/reference/attributes.html):#[rustfmt::skip] struct S {} #[clippy::cyclomatic_complexity = "100"] pub fn f() {}
This is quite different from PHP's semantics, so it's not clear that
copying the same start/end symbol would really be a benefit for us.
Also note that unlike PHP,#
does not start a comment in Rust. -
-
Familiar with Docblock Usage:
-
@@
has the advantage here once more.
-
-
Tokens used:
- This isn't clearly a pro or con in itself.
-
Changes the lexing of remaining tokens:
- This is apparently a con for
#[]
.
- This is apparently a con for
Ultimately I think @@
does the best job balancing a very small BC
break with concise, familiar syntax that can cleanly support nested
attributes in the future. And since it avoids the need for attribute
grouping it also has the simplest implementation.
Kind regards,
Theodore
Even if we assume the implementation is only about 30 lines, it's
still extra complexity that I don't understand the benefit of. I
sincerely would like to know what advantage there is of grouped
attributes over the@@
syntax.It was very specifically voted for:
https://wiki.php.net/rfc/attribute_amendments#group_statement_for_attributesIt was specifically voted for the
<<>>
syntax, with the explicit
qualification that "This feature would be superseded by any other RFC
getting accepted that changes the syntax." This is exactly what
happened when the Shorter Attribute Syntax RFC was accepted.
But there wasn't a specific vote to remove that, like there was one to
enable it.
You still haven't addressed any of the deficiencies that the other
alternatives don't have:
https://wiki.php.net/rfc/shorter_attribute_syntax_change#proposalI'm not sure which deficiencies you mean, but let's briefly go
through the table in the RFC to make sure nothing has been missed:
- Number of required Characters:
@@
has the advantage here.
But @@ takes up 94 pixels, whereas #[] only takes up 77 (and @[] 83), so
clearly better.
- Has End Delimiter:
- This isn't clearly a pro or a con in itself.
But you haven't said why it is better that not having it is better.
- Allows Grouping:
- As discussed before,
@@
has the advantage of being equally
concise without this added complexity.
I have no idea what that means.
- Forward Compatibility in PHP 7:
- This is at best a temporary benefit of
#[]
which will be
irrelevant in a few years, at worst a source of confusion and bugs
when code intended for PHP 8 runs on PHP 7 with different results.
But it helps now, maybe only a little, but it does.
- Breaks BC of valid PHP 7 code:
- All syntaxes but
<<>>
technically have a BC break. There really
should be a separate line in the table for "Breaks useful syntax",
since#[]
and@[]
have this deficiency, but@@
does not.
@[] and #[] don't break "useful syntax" either.
- Used by other language:
- This is listed as an advantage for
#[]
and<<>>
. However, the table
fails to point out that Hack is migrating away from<<>>
to@Attr
.
It can only do that because they are removing @ as the shut up operator,
which ain't going to happen in PHP.
Furthermore, while `#[]` has the same start/end symbols as Rust, the rest of the grammar/semantics vary significantly. E.g. these are valid Rust attributes (see https://doc.rust-lang.org/reference/attributes.html):
I've never said that it has the same semantics, only that the syntax is
familiar. It still stands that nothing uses @@.
- Familiar with Docblock Usage:
@@
has the advantage here once more.
@@ isn't used in docblocks.
- Tokens used:
- This isn't clearly a pro or con in itself.
[citation required]
- Changes the lexing of remaining tokens:
- This is apparently a con for
#[]
.
That's why there is @[] now, which is a compromise, something that you
don't seem to be interested in caring about.
cheers,
Derick
--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug
- Used by other language:
- This is listed as an advantage for
#[]
and<<>>
. However, the table
fails to point out that Hack is migrating away from<<>>
to@Attr
.It can only do that because they are removing @ as the shut up operator,
which ain't going to happen in PHP.
If we could afford the luxury of removing the @ operator, would you
prefer @ for attributes?
--
Christoph M. Becker
- Used by other language:
- This is listed as an advantage for
#[]
and<<>>
. However, the table
fails to point out that Hack is migrating away from<<>>
to@Attr
.It can only do that because they are removing @ as the shut up operator,
which ain't going to happen in PHP.If we could afford the luxury of removing the @ operator, would you
prefer @ for attributes?
No.
cheers,
Derick
--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug
Le 6 août 2020 à 10:11, Benas IML benas.molis.iml@gmail.com a écrit :
Ending delimiter MAY help us in the future.
I really, really hate all of those arguments stating "that we should care
only about the present, not the future" and that even though
#[...]
/@[...]
might bring benefits in the future, we should still
choose@@
".This shows clearly that some people are basing their views on subjective
reasons rather than being objective.As far as this discussion is going, I see pro-
@@
people just saying
"Arghhh, let's keep @@, it doesn't bring any benefits that other syntaxes
do but we don't need them anyways, let's not speculate future".It's like saying you can either go through door A and get a free car or
through door B and get the same car and maybe, even an additional
1,000$.We are playing probabilities here but at the moment, no one has said any
substantial argument why@@
is better and thus,@[...]
seems like a
better option in the long term.
Note that, in a hypothetical future where the absence of delimiters would lead to (perceive or real) ambiguity, it will always possible to add optional ones, as in: @@simple("thing")
and @@{very("complex") thing}
.
—Claude
On Thu, Aug 6, 2020 at 9:18 AM Côme Chilliet <
come.chilliet@fusiondirectory.org> wrote:
Le Thu, 6 Aug 2020 07:48:05 +0100 (BST),
Derick Rethans derick@php.net a écrit :From the RFC:
- No ending delimiter
As said before, it does have an ending delimiter when they are arguments
since
there is the parenthesis around them. When there are no arguments I don’t
see
the benefit of an ending delimiter, it’s easy to spot the end of the word.
- Doesn't allow grouping
I do not understand this argument, what is the point of grouping for @@?
Does grouping mean anything special for other syntaxes, or is it just to
save
keystrokes? If it is just to get a more concise syntax when there are
several
attributes, the fact that @@ do not need grouping is a pro, not a con.
- No forwards compat with PHP 7
But no BC break either, while #[] introduces BC break.
This is not true. Both @@ and #[ will break existing PHP 7 code!
The question is how likely each of them is. #[ will be slightly higher than
@@ - but both will still be in the 0,000001% range of occurrences.
and for both the same Fix is a project wide sed that replaces @@ with
@<space>@ and #[ with #<space>[ respectively.
- Not used ny another language
@ is used by a lot of other languages, and @@ is the closest we can get in
PHP.Côme
--
To unsubscribe, visit: https://www.php.net/unsub.php
Hi Derick,
I'd like to reinforce the idea that this RFC (as all RFCs) needs a Yes/No
primary vote which should attain a 2/3 majority to pass. As it was the case
with https://wiki.php.net/rfc/shorter_attribute_syntax, it had a primary
vote asking "Are you okay with re-voting on the attribute syntax for PHP
8.0?" and that vote passed with 50 to 8.
The primary vote on this RFC could be the exact same question, but I
believe the primary vote needs to be there. Without this primary vote, we
could be enacting a change that only (with 4 options) 25%+1 voters support,
which is clearly insufficient. However, if 2/3 of the voters agree that
something needs to change, they are also accepting that the change may not
be the one they prefer.
From the voting RFC (https://wiki.php.net/RFC/voting#required_majority):
"The primary vote of an RFC, determining overall acceptance of the
proposal, may only have two voting options and requires a 2/3 majority.
This means that the number of Yes votes must be greater than or equal to
the number of No votes multiplied by two."
On the same RFC we can also find information about the format of secondary
votes which mandates a simple majority, this should disqualify STV:
"Additionally, an RFC may have secondary votes, which are used to decide
implementation details. Such votes may have more than two voting options
and may be decided by simple plurality. This means that the voting option
with the most votes wins. If there are multiple options with the most
number of votes, it is left at the discretion of the RFC author to choose
one of them."
I'm not saying that I agree or disagree with the changes you propose, but I
think that all RFCs should follow the rules that are laid out. Those rules
were last changed by an RFC which also required a 2/3 majority (
https://wiki.php.net/rfc/abolish-narrow-margins), so if you want to change
the requirements to accept an RFC, you should propose them and they should
be accepted before proposing a RFC which does not abide to these
requirements.
Regards,
Pedro
Hi,
Out of Banjamin's suggestion[1], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
FWIW, this has an excemption from the RM Sara as per [2]:
- Shorter Attribute Syntax Change
- Joe/Derick - Please make sure this RFC moves along and reaches
conclusion by beta3, as discussed previously.cheers,
Derick[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug--
To unsubscribe, visit: https://www.php.net/unsub.php
Hi all,
I'd like to reinforce the idea that this RFC (as all RFCs) needs a Yes/No
primary vote which should attain a 2/3 majority to pass. As it was the case
with https://wiki.php.net/rfc/shorter_attribute_syntax, it had a primary
vote asking "Are you okay with re-voting on the attribute syntax for PHP
8.0?" and that vote passed with 50 to 8.The primary vote on this RFC could be the exact same question, but I
believe the primary vote needs to be there. Without this primary vote, we
could be enacting a change that only (with 4 options) 25%+1 voters support,
which is clearly insufficient. However, if 2/3 of the voters agree that
something needs to change, they are also accepting that the change may not
be the one they prefer.
Hear, hear. If this RFC must go to a vote (and that is not a given), then adding a primary vote along the lines of "Are you okay with re-voting on the attribute syntax for PHP 8.0?" would go a long way toward alleviating the "vote until the voters get it 'right'" problem.
--
Paul M. Jones
pmjones@pmjones.io
http://paul-m-jones.com
Modernizing Legacy Applications in PHP
https://leanpub.com/mlaphp
Solving the N+1 Problem in PHP
https://leanpub.com/sn1php
I'd like to reinforce the idea that this RFC (as all RFCs) needs a
Yes/No primary vote which should attain a 2/3 majority to pass.
I'll make that clear in the RFC, that was obviously my intention.
cheers,
Derick
--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug
Hi Derick,
Out of Banjamin's suggestion[1], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
-
I feel like "Changes the lexing of remaining tokens" should also be included in the table following it - that's a major difference between
#[
(Yes) and each of the other proposals (No).
The last time a substantial lexing change (that affected the following tokens, not just the tokens in question) happened was https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes , but flexible heredoc is rare in practice and a project using it would almost always need to drop support for 7.2.
I expect attributes to be used much, much more frequently than flexible heredoc, and to break in subtler ways.
Projects such as php-parser would be affected by the change to lexing, and would either have to force users to specify the php major version or to always emulate 8.0's lexing if#[
was encountered in aT_COMMENT
token.My earlier objections to
#[
were https://externals.io/message/111218#111239To add to that, the benefit of forwards compatibility is also a drawback in some ways for the next few years (or longer, if you include OSes that unofficially backport security patches)
A developer running php7 could runphp --syntax-check
locally on a file containing attributes
and assume it'd work in php 8 when deployed to a php 8 environment or when publishing a library to packagist.
(e.g.#[DeprecationReason('This won't work because X')]
has a single quote afterwon
terminating a string literal, resulting in a parse error only affecting php 8)Better tooling would help to avoid that, but better tooling isn't universal.
-
This RFC mentions objections to
@@
but not objections to other syntaxes.
Summarizing/Linking the main arguments for/against all 4+ proposed syntaxes in an appendix of the RFC (with some reasonable length limit) would help in making an informed vote.There have been over 50 emails so far in https://externals.io/message/111300 and https://externals.io/message/111312
Thanks,
- Tyson
Hello Derick & Internals,
I am a daily user of PHP and read through all the recent discussions about the
attribute syntax, and thought I could add some slightly different viewpoints
from an "end-user" who uses the current annotations a lot. This is my first time
posting, so I am hoping I am doing this the right way ;-)
Currently, I am favoring @@, although I don't have strong preferences to other
syntax if it is more useful in some way. Why I prefer @@:
-
The @ symbol is hardly used in PHP, except for error suppression and within
comments, so searching and scanning over code with @@ works well and does not
have much ambiguity. The syntax with [] (and a symbol) is very close to the PHP
syntax for arrays and destructuring, and would now have a different meaning in
addition to that. This is not the case for C/C++/C# as far as I can tell, as []
is rarely used in those languages so having [] for attributes there makes it
quite recognizable/unique. -
A big argument about the ending delimiter is about consistency. Yet isn't an
attribute almost like the "new" keyword, which also only allows a class name and
then optionally some arguments passed to the constructor? It is not like you can
define anything but a class + arguments as an attribute, and "new" does not have
starting and ending delimiters. -
What would starting and ending delimiters be used for except for grouping
attributes? I would be really interested in use cases, and if delimiters are
important, then a few real-world examples why they are important and how the
syntax will come in handy later would be the best argument for them. After using
the current annotations for years it has not occured to me that something is
fundamentally missing, and attributes have been used for many years as
annotations in PHP as well as in other languages, so there should be some
evidence/examples. -
If at a later time grouping or more options become necessary, something like
@@{} could be an optional syntax. Using {} to optionally group something in PHP
has a lot of precendence, and if it is only optional, it seems like a reasonable
addition while still having the simple just-one-class-with-arguments attributes.
When looking at the new RFC, I feel like none of the syntax arguments in the RFC
are very self-explanatory or even would be a factor why I would prefer them or
not. A larger explanation about each syntax, some real code samples with each
syntax (possibly with colors) and longer pro/con arguments would be a lot better
for an informed decision, so if there is a lot of contention around the syntax,
I think more time to flesh out such an RFC and then do it for 8.1 would be
better. At the same time I do feel like @@ would be a good syntax, but if there
are open questions or more discussions to be had it might be better to have the
time for those compared to having hasty discussions now with a hasty vote where
everyone will be unhappy at the end.
Best regards,
Andreas
Hi everyone. I’m not a PHP internal, just a modest PHP developer. But I felt
a desire to share my observation on “@@”.
Some symbols looks very okay when doubled. For example, we use “//” for comments
and “||” for logical alternative. They are okay, because they contains only
two parallel lines. There is a symbol like that in mathematics: “∥”. Programmer
fonts (for example Fira Code) convert doubled characters to an appropriate
ligature.
On the other side, the at sign “@” contains the small letter “a” in a circle.
It’s feels full to the brim. It’s complete and closed whole. It’s like a donut
with tasty filling. ;-) But when we double it, the resulting “@@” is bloated.
Even intuitively not right.
Why “@@” was proposed? Because “@” is already taken. Sorry, but it’s born out of
helplessness (in the most visible way in comparison to other syntaxes). And
maybe this is the reason why some of community members feel bad about it
(no matter of technical arguments).
One could argue that it’s a matter of taste. Well, only to some degree. Mankind
invented typography and editing, so rules of esthetic and harmonious writing
exist. PHP has PSR-12 (“Extended Coding Style”) for this.
Now I’d like to draw your attention to this syntax:
<<
@Assert\NotNull
@Assert\Type('string')
@ORM\Column(type='string')
private string $username;
It has some good points. First of all, it uses single “@”. This is a popular
choice in other programming languages, including JavaScript – a natural
companion of PHP in Web programming.
Nesting attributes in this syntax is very natural.
The mental model of the syntax reads like that: Here I put “<<” and it starts
a metadata (metaprogramming) context. Now I put “@” for every attribute. Let’s
finish it with “>>”. I like this separation of metaprograming and a real code.
It’s something that remainds me DocBlock.
The syntax has it’s weak points, of course. For example, a single attribute
looks a bit verbose. A good syntax highliting may help to blunt this impression.
<<@Deprecated>>
public function doSomething()
Moreover, the more spaced syntax may be preffered (and I like it more):
<<
@Deprecated
public function doSomething()
Another option would be to use a keyword, just like “new” with a class name.
meta Assert\NotNull
meta Assert\Type('string')
meta ORM\Column(type='string')
private string $username;
Going back to nested attributes, what I don’t like about “@[]” and “#[]” is that
the at sing is at first before brackets, but for nested attributes it will be
put together with an attribute name:
@[Attribute(@NestedAttribute('text')]
I believe this RFC should have an example section to show every syntax in
practice.
Best wishes to all of you.
We have updated the RFC with all (hopefully) of the feedback from this
discussion:
https://wiki.php.net/rfc/shorter_attribute_syntax_change
Most notable changes are:
- A new section with several subsections on the benefits of a closing
delimiter / enclosing syntax. - A section on grouping pro/cons
- Inclusion of @: as per Theodores request
We are looking for further feedback from the community.
Hi,
Out of Banjamin's suggestion[1], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
FWIW, this has an excemption from the RM Sara as per [2]:
- Shorter Attribute Syntax Change
- Joe/Derick - Please make sure this RFC moves along and reaches
conclusion by beta3, as discussed previously.cheers,
Derick[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug--
To unsubscribe, visit: https://www.php.net/unsub.php
I have one major issues with the examples.
Syntax Side by Side: The properties are annotated (with attributes)
inline which is the opposited of common usage now (with annotation).
Discussion on Grouping Pro/Cons: But since this depends on the coding
style the user... No, this should be consulted with PSR people and their
recommendations should be discussed there.
Enclosing Delimiters - Complexity of Attribute Declaration: there should
be example on left side without and on right side with - I do not see
how delimiters will actually help
Discussion on grep'ability - the arguments against are theoretical,
imports are not very often aliased, this is clearly a con for grouping
Excl. the <<>> syntax (which I think is not good because of generics
that will come sooner or later), all other examples are about good
prefix for attributes. So I think we should discuss the best prefix and
separately if we want to allow grouping with "[" or even with "{".
The most prefer syntax can be @: for ungrouped attributes and @:[] for
grouped one, but this combination is not discussed there.
With kind regards / Mit freundlichen Grüßen / S přátelským pozdravem,
Michael Voříšek
We have updated the RFC with all (hopefully) of the feedback from this
discussion:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Most notable changes are:
- A new section with several subsections on the benefits of a closing
delimiter / enclosing syntax.- A section on grouping pro/cons
- Inclusion of @: as per Theodores request
We are looking for further feedback from the community.
Hi,
Out of Banjamin's suggestion[1 [1]], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
FWIW, this has an excemption from the RM Sara as per [2 [2]]:
- Shorter Attribute Syntax Change
- Joe/Derick - Please make sure this RFC moves along and reaches
conclusion by beta3, as discussed previously.cheers,
Derick[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug--
To unsubscribe, visit: https://www.php.net/unsub.php
Links:
[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286
Hi Benjamin,
We are looking for further feedback from the community.
Thanks, the updated RFC looks much better.
Some more feedback on why the edge cases are a concern to me,
and why the lack of an ending delimiter is similar to parsing problems already faced.
I'd agree that restarting a two-week discussion period seems excessive, and a shorter one is fine with me.
The references section should probably also link to the other 2 RFC discussion threads
https://externals.io/message/111416 and the RFC discussion thread https://externals.io/message/111218
Developers who are new to PHP (e.g. learning by example) or those who spend most of their time programming in other languages such as Rust or Java or Golang
might forget/not know that #
is a supported line comment syntax, or that attributes were introduced in 8.0 (not an earlier release).
They might see that code using these edge cases passes syntax checks in PHP 7.4 and 8.0, and assume it'd work the same way in both versions, leading to published code incorrectly marked as compatible with PHP 7.4.
- PHP doesn't warn about calling a user-defined function too many parameters, making this harder to detect.
The #[]
syntax makes it possible and convenient to use attributes syntax,
but causes various problems for end users of code using attributes syntax.
I'd expect the drawbacks of bugs caused by edge cases such
as those in https://wiki.php.net/rfc/shorter_attribute_syntax_change#discussion_of_forwards_compatibility_procons
to outweigh the benefits of being able to release attributes immediately.
Putting attributes on the same line as parameters or closures or anonymous classes seems natural to do to me,
and I'd expect releases would do it eventually, whether it be immediately in 8.0, years from now, etc.
Suppose that package A/A
supports PHP 7.4|^8.0
.
It depends on a package B/B
2.0 which supports PHP 7.4.
B/B
depends on C/C
^4.0|^5.0
, where C/C 4.x supports PHP 7
and C/C 5.0 drops support for PHP 7.
C/C 5.x uses attribute syntax on the same line as other code,
including several edge cases with one-line attributes that parse differently in php 7.0.
public function doDbMaintenance(
#[MyUnused] bool $log = false, // unused in db backend
bool $doPotentiallyDestructiveUpdate = false,
mixed $extraFlags = null,
) {...}
// B/B calls doDbMaintenance($log = true)
Then suppose that a maintainer or third-party packager (e.g. for a Linux distro) of A/A
runs composer install with PHP 8.0 before building a package such as a phar, rpm, or tarball
(or vendor/
checked into git) from A/A
1.0.
They would pull in B/B 2.0 and C/C 5.0, creating a release of A/A that was buggy
but did not emit any parse, compilation, or runtime warnings if end users ran that release with php 7.4.
Then the maintainers of A/A
and C/C
5.0 would get bug reports for PHP 7.4 for mysterious behaviors with no warnings,
which would be hard to reproduce and debug, despite all involved packages correctly specifying their dependencies.
End users would also be inconvenienced by bugs that had no obvious indication or subtler symptoms that may take a long time to get reported.
This could be worked around by
-
Setting
{"config": {"platform": {"php": "7.4.9"}}}
in composer.json of A/A,
or by documenting thatcomposer install
should always be run with PHP 7.4,
but I wouldn't expect new composer users to be aware of the ability to do that
until they run into issues, and that doesn't help if A/A is a dependency of another package. -
C/C 5.0 could exit() when bootstrapping when it's run in php 7,
but that seems excessive and not currently done by libraries in my experience.
If a developer needs to backport code or patches for php 8.0+ to php 7.4 or older
(e.g. to support legacy applications or OSes that make updating php impractical),
the lack of a syntax error would make this backporting error prone
if the developer didn't remember this incompatibility
or learn about tools created to catch issues.
(or didn't know about up-to-date, bug-free tools to downgrade php syntax)
For https://wiki.php.net/rfc/shorter_attribute_syntax_change#machine_scanning_for_end_of_attribute_declaration
I'd agree that the lack of an ending delimiter makes token-based extraction more complicated but still practical,
but it is a complexity that projects such as phpcs would already face in similar syntaxes.
The problems with whitespace and comments and doc comments between tokens can be fixed by filtering out whitespace and comments before/while looking to the end of a token.
Projects such as nikic/php-parser or microsoft/tolerant-php-parser would be what I'd recommend for new code/scripts,
but this is impractical for large existing codebases with third party plugins such as phpcs.
A stack-based approach is used for @[
or #[
.
A stack-based approach would also be used for @@Attribute /*comment */ (
by skipping T_WHITESPACE, T_COMMENT, and T_DOC_COMMENT
and ending parsing of that attribute if the next token isn't (
.
Skipping whitespace and comments that way already needs to be done to correctly find the end of the function call myGlobalFunction /* comment */ (args);
(or new MyClass /* comment */ (args)
).
For both function calls and attributes, I'd assume style guides would forbid whitespace and comments before (
.
Thanks,
- Tyson
On Sun, Aug 16, 2020 at 4:47 PM tyson andre tysonandre775@hotmail.com
wrote:
Hi Benjamin,
We are looking for further feedback from the community.
Thanks, the updated RFC looks much better.
Some more feedback on why the edge cases are a concern to me,
and why the lack of an ending delimiter is similar to parsing problems
already faced.I'd agree that restarting a two-week discussion period seems excessive,
and a shorter one is fine with me.
Thank you for the feedback, the section on #[] forward compatibility is
something I want to improve a bit more today, your feedback helps a lot.
The references section should probably also link to the other 2 RFC
discussion threads
https://externals.io/message/111416 and the RFC discussion thread
https://externals.io/message/111218
Developers who are new to PHP (e.g. learning by example) or those who
spend most of their time programming in other languages such as Rust or
Java or Golang
might forget/not know that#
is a supported line comment syntax, or that
attributes were introduced in 8.0 (not an earlier release).
They might see that code using these edge cases passes syntax checks in
PHP 7.4 and 8.0, and assume it'd work the same way in both versions,
leading to published code incorrectly marked as compatible with PHP 7.4.
- PHP doesn't warn about calling a user-defined function too many
parameters, making this harder to detect.
The
#[]
syntax makes it possible and convenient to use attributes syntax,
but causes various problems for end users of code using attributes syntax.
I'd expect the drawbacks of bugs caused by edge cases such
as those in
https://wiki.php.net/rfc/shorter_attribute_syntax_change#discussion_of_forwards_compatibility_procons
to outweigh the benefits of being able to release attributes immediately.Putting attributes on the same line as parameters or closures or anonymous
classes seems natural to do to me,
and I'd expect releases would do it eventually, whether it be immediately
in 8.0, years from now, etc.Suppose that package
A/A
supports PHP7.4|^8.0
.
It depends on a packageB/B
2.0 which supports PHP 7.4.
B/B
depends onC/C
^4.0|^5.0
, where C/C 4.x supports PHP 7
and C/C 5.0 drops support for PHP 7.
C/C 5.x uses attribute syntax on the same line as other code,
including several edge cases with one-line attributes that parse
differently in php 7.0.public function doDbMaintenance( #[MyUnused] bool $log = false, // unused in db backend bool $doPotentiallyDestructiveUpdate = false, mixed $extraFlags = null, ) {...} // B/B calls doDbMaintenance($log = true)
Then suppose that a maintainer or third-party packager (e.g. for a Linux
distro) ofA/A
runs composer install with PHP 8.0 before building a package such as a
phar, rpm, or tarball
(orvendor/
checked into git) fromA/A
1.0.
They would pull in B/B 2.0 and C/C 5.0, creating a release of A/A that was
buggy
but did not emit any parse, compilation, or runtime warnings if end users
ran that release with php 7.4.Then the maintainers of
A/A
andC/C
5.0 would get bug reports for PHP
7.4 for mysterious behaviors with no warnings,
which would be hard to reproduce and debug, despite all involved packages
correctly specifying their dependencies.
End users would also be inconvenienced by bugs that had no obvious
indication or subtler symptoms that may take a long time to get reported.This could be worked around by
Setting
{"config": {"platform": {"php": "7.4.9"}}}
in composer.json
of A/A,
or by documenting thatcomposer install
should always be run with PHP
7.4,
but I wouldn't expect new composer users to be aware of the ability to
do that
until they run into issues, and that doesn't help if A/A is a
dependency of another package.C/C 5.0 could exit() when bootstrapping when it's run in php 7,
but that seems excessive and not currently done by libraries in my
experience.
If a developer needs to backport code or patches for php 8.0+ to php 7.4
or older
(e.g. to support legacy applications or OSes that make updating php
impractical),
the lack of a syntax error would make this backporting error prone
if the developer didn't remember this incompatibility
or learn about tools created to catch issues.
(or didn't know about up-to-date, bug-free tools to downgrade php syntax)
For
https://wiki.php.net/rfc/shorter_attribute_syntax_change#machine_scanning_for_end_of_attribute_declaration
I'd agree that the lack of an ending delimiter makes token-based
extraction more complicated but still practical,
but it is a complexity that projects such as phpcs would already face in
similar syntaxes.
The problems with whitespace and comments and doc comments between tokens
can be fixed by filtering out whitespace and comments before/while looking
to the end of a token.
Projects such as nikic/php-parser or microsoft/tolerant-php-parser would
be what I'd recommend for new code/scripts,
but this is impractical for large existing codebases with third party
plugins such as phpcs.A stack-based approach is used for
@[
or#[
.
A stack-based approach would also be used for@@Attribute /*comment */ (
by skipping T_WHITESPACE, T_COMMENT, andT_DOC_COMMENT
and ending parsing
of that attribute if the next token isn't(
.
Skipping whitespace and comments that way already needs to be done to
correctly find the end of the function callmyGlobalFunction /* comment */ (args);
(ornew MyClass /* comment */ (args)
).
For both function calls and attributes, I'd assume style guides would
forbid whitespace and comments before(
.Thanks,
- Tyson
We have updated the RFC with all (hopefully) of the feedback from
this discussion:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Most notable changes are:
- A new section with several subsections on the benefits of a closing
delimiter / enclosing syntax.- A section on grouping pro/cons
- Inclusion of @: as per Theodores request
We are looking for further feedback from the community.
Hi Benjamin and Derick,
Thank you for taking the time to further flesh out the RFC and
include the @:
syntax option. Overall it is a lot better now.
However, I still have some concerns with several claims in the RFC
that are inaccurate or incomplete, particularly in the "Discussion
on Ending Delimiter / Enclosing Delimiters" section. 1
The RFC intro says "we should strongly favor a syntax with closing
delimiter to keep consistency with other parts of the language". It
is then argued that "Many complex syntax constructs in PHP have an
ending delimiter", and therefore attributes should have one as well.
However, ending delimiters in PHP have little to do with how "complex"
a syntax construct is (which is a rather loose definition, anyway).
As I've pointed out before, standalone statements and declarations
generally require an end symbol, but modifiers before a declaration
do not. Attributes fall into the latter category, and therefore the
lack of an end delimiter is consistent.
The RFC responds to this counterargument with a series of four
claims, none of which is fully accurate in describing declaration
modifiers:
-
Even if we only consider keyword declaration modifiers, the claim
that "these modifier keywords all have only exactly one token that
can immediately follow them, T_WHITESPACE" is not correct. Just as
with attributes, modifier keywords can also be followed by a comment
token (#, //, or /**/):@@Attribute// some comment final// some comment class Foo {...}
Strangely, the RFC only lists keywords like public and final as
declaration modifiers, and neglects to mention that type declarations
are also in this category (which I have pointed out in all my
previous responses to this argument).
Type declarations can be not only followed by whitespace and comment
tokens, but also a T_VARIABLE
token:
function foo(Type$bar) {}
-
The RFC goes on to claim that "[declaration modifiers] are all
non-complex and are only made up of a handful ascii letters". Again,
this fails to consider type declarations, which can contain the same
non-ascii characters that attribute names can. -
Next, the RFC says "these keywords are always on a single line".
But union type declarations can be spread across multiple lines,
and still don't have an end delimiter:function foo( \My\FullyQualified\ClassName |string $param ) {...}
-
Finally, the RFC says that "visibility keywords are only boolean
or bitflags in Reflection, but Attributes are a full fledged
ReflectionAttribute
representing their own distinct language concept."
You can probably guess where I'm going with this... Type declarations
are likewise a fully fledgedReflectionType
representing their own
distinct language concept.
So the RFC's argument that attributes need to have a distinct ending
symbol for consistency is not convincing. The lack of an ending
delimiter is fully consistent with other declaration modifiers,
whether simple or complex.
Benefits for IDEs and editors?
The RFC suggests a benefit of "Consistent colouring for being an end
of the attribute syntax and the keywords in between can use different
colors." I don't really understand this argument. How would an end
delimiter change the syntax highlighting provided by IDEs?
Another suggested benefit is that IDEs can "Implement regions to
open/close the grouped declaration of one or multiple attributes."
But IDEs can still do this without an end delimiter, and groups of
attributes could even be opened/closed independently by separating
them with an empty line (which should improve readability for humans
as well).
Easier machine parsing?
The RFC shows a list of different ways that attributes with the @@
syntax can end, and claims "This makes programmatic token based
scanning for attribute syntax without a closing delimiter such as @@
unnecessarily complicated."
But I've worked with userland token stream scanners myself, and it's
not difficult to skip T_WHITESPACE
and T_COMMENT
tokens. Once you do
that, parsing an attribute is as simple as finding any T_ATTRIBUTE
token followed by the name token, then checking for an optional
argument list. If there's not an argument list, that's then end of
the attribute, otherwise the end is the end of the argument list.
With the @[]
and #[]
syntaxes, a userland token parser is actually
more complex due to grouping. It not only has to do the same things
listed above, but it also has to check whether there are multiple
comma-separated attributes between the start/end delimiters (making
sure not to confuse a comma-separated attribute with a comma-separated
argument, or the end of an array argument with the attribute end
delimiter).
So I don't understand how the RFC can claim that attributes without
an end symbol "introduce additional complexity" for machines, when if
anything the opposite is true.
(And don't get me started about the extra difficulty for token stream
scanners with the <<>>
syntax which has no T_ATTRIBUTE
token).
Forcing @@ attributes to end with parenthesis?
I don't really see the point of this section in the RFC. What issue
would forcing an end parenthesis solve? And what does whitespace
between the attribute name and argument list have to do with anything?
Such whitespace is allowed with all of the proposed syntaxes.
I do agree, though, that requiring an end parenthesis for @@
would
be inconsistent with object instantiation - that's one of the main
reasons I didn't require it in the Shorter Attribute Syntax RFC.
Potential Future Benefits of Enclosed Delimiter Syntax?
The RFC shows an example of a potential "simpler" attribute using a
string instead of a class name. I honestly have no idea what this is
supposed to do or what benefit it would have over normal attributes.
The concept of attributes being a class name with optional arguments
has been proven over many years by its use in docblock annotations,
and if there was some deficiency in what this syntax allows it seems
like we would have discovered it by now.
Attribute nesting
The RFC points out that all the syntaxes can allow attribute nesting,
which is true. However, it would be nice to include an example of
potential future nesting for each syntax, as was included in the
original Shorter Attribute Syntax RFC. The reason is that some of the
syntaxes are less readable than others when nested (particularly <<>>
,
though arguably #[]
and @[]
as well since the attribute end
delimiter can be confused with the end bracket of an array argument.
@@JoinTable(
"User_Group",
@@JoinColumn("User_id", "id"),
@@JoinColumn("Group_id", "id"),
)
private $groups;
#[JoinTable(
"User_Group",
#[JoinColumn("User_id", "id")],
#[JoinColumn("Group_id", "id")],
)]
private $groups;
@[JoinTable(
"User_Group",
@[JoinColumn("User_id", "id")],
@[JoinColumn("Group_id", "id")],
)]
private $groups;
<<JoinTable(
"User_Group",
<<JoinColumn("User_id", "id")>>,
<<JoinColumn("Group_id", "id")>>,
)>>
private $groups;
@:JoinTable(
"User_Group",
@:JoinColumn("User_id", "id"),
@:JoinColumn("Group_id", "id"),
)
private $groups;
With appreciation,
Theodore
Forcing @@ attributes to end with parenthesis?
I don't really see the point of this section in the RFC.
The blame for that is on me, not Benjamin and Derek, as I repeatedly asked
why a compulsory ) could not be considered a closing delimiter.
Attribute nesting
The RFC points out that all the syntaxes can allow attribute nesting,
which is true. However, it would be nice to include an example of
potential future nesting for each syntax, as was included in the
original Shorter Attribute Syntax RFC. The reason is that some of the
syntaxes are less readable than others when nested (particularly<<>>
,
though arguably#[]
and@[]
as well since the attribute end
delimiter can be confused with the end bracket of an array argument.@@JoinTable( "User_Group", @@JoinColumn("User_id", "id"), @@JoinColumn("Group_id", "id"), ) private $groups; #[JoinTable( "User_Group", #[JoinColumn("User_id", "id")], #[JoinColumn("Group_id", "id")], )] private $groups; @[JoinTable( "User_Group", @[JoinColumn("User_id", "id")], @[JoinColumn("Group_id", "id")], )] private $groups; <<JoinTable( "User_Group", <<JoinColumn("User_id", "id")>>, <<JoinColumn("Group_id", "id")>>, )>> private $groups; @:JoinTable( "User_Group", @:JoinColumn("User_id", "id"), @:JoinColumn("Group_id", "id"), ) private $groups;
Good catch.
Peter
On Mon, Aug 17, 2020 at 3:06 AM Theodore Brown theodorejb@outlook.com
wrote:
On Sun, Aug 16, 2020 at 4:36 AM Benjamin Eberlei kontakt@beberlei.de
wrote:We have updated the RFC with all (hopefully) of the feedback from
this discussion:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Most notable changes are:
- A new section with several subsections on the benefits of a closing
delimiter / enclosing syntax.- A section on grouping pro/cons
- Inclusion of @: as per Theodores request
We are looking for further feedback from the community.
Hi Benjamin and Derick,
Thank you for taking the time to further flesh out the RFC and
include the@:
syntax option. Overall it is a lot better now.
However, I still have some concerns with several claims in the RFC
that are inaccurate or incomplete, particularly in the "Discussion
on Ending Delimiter / Enclosing Delimiters" section. 1The RFC intro says "we should strongly favor a syntax with closing
delimiter to keep consistency with other parts of the language". It
is then argued that "Many complex syntax constructs in PHP have an
ending delimiter", and therefore attributes should have one as well.However, ending delimiters in PHP have little to do with how "complex"
a syntax construct is (which is a rather loose definition, anyway).
As I've pointed out before, standalone statements and declarations
generally require an end symbol, but modifiers before a declaration
do not. Attributes fall into the latter category, and therefore the
lack of an end delimiter is consistent.
A docblock is also a "modifier" under your declaration and it has an ending
symbol.
The RFC gives a definition of the complexity as just a token vs a set of
name, arugment_list and constant expression parser rules. It shows
an example porting an ORM\JoinTable Attribute, which has arguments, named
parameter usage, complex definitions of default values (Strings, arrays).
This piece of code probably touches 10-20 parser rules.
Most modifiers don't even have a parser rule, as they only match their
token.
The RFC responds to this counterargument with a series of four
claims, none of which is fully accurate in describing declaration
modifiers:
Even if we only consider keyword declaration modifiers, the claim
that "these modifier keywords all have only exactly one token that
can immediately follow them, T_WHITESPACE" is not correct. Just as
with attributes, modifier keywords can also be followed by a comment
token (#, //, or /**/):@@Attribute// some comment final// some comment class Foo {...}
Strangely, the RFC only lists keywords like public and final as
declaration modifiers, and neglects to mention that type declarations
are also in this category (which I have pointed out in all my
previous responses to this argument).
Type declarations can be not only followed by whitespace and comment
tokens, but also aT_VARIABLE
token:function foo(Type$bar) {}
- The RFC goes on to claim that "[declaration modifiers] are all
non-complex and are only made up of a handful ascii letters". Again,
this fails to consider type declarations, which can contain the same
non-ascii characters that attribute names can.
Types are missing indeed, and they are more complex than a simple token,
but less complex than attribute declarations.
I guess the difference is that union types are new, and type definitions
used to be simple. Attributes however are new
and already complex, so we still have the option of always enclosing them.
Next, the RFC says "these keywords are always on a single line".
But union type declarations can be spread across multiple lines,
and still don't have an end delimiter:function foo( \My\FullyQualified\ClassName |string $param ) {...}
Finally, the RFC says that "visibility keywords are only boolean
or bitflags in Reflection, but Attributes are a full fledged
ReflectionAttribute
representing their own distinct language concept."
You can probably guess where I'm going with this... Type declarations
are likewise a fully fledgedReflectionType
representing their own
distinct language concept.So the RFC's argument that attributes need to have a distinct ending
symbol for consistency is not convincing. The lack of an ending
delimiter is fully consistent with other declaration modifiers,
whether simple or complex.Benefits for IDEs and editors?
The RFC suggests a benefit of "Consistent colouring for being an end
of the attribute syntax and the keywords in between can use different
colors." I don't really understand this argument. How would an end
delimiter change the syntax highlighting provided by IDEs?
If you consider the three elements of an attribute declaration: 1. Syntax
for Attributes 2. Atttribute Name 3. Arguments
then if you color them in three different ways, then with an ending symbol
it improves the human readability
to have the end be in the same color als the beginning.
Another suggested benefit is that IDEs can "Implement regions to
open/close the grouped declaration of one or multiple attributes."
But IDEs can still do this without an end delimiter, and groups of
attributes could even be opened/closed independently by separating
them with an empty line (which should improve readability for humans
as well).
Yes regions would be possible for a whole block of attributes with @@ as a
single block.
or when adding an empty line between them. But that completely detaches
attributes from the declaration
visually to have an empty line between them, so coding styles would
probably not allow that. With grouping and end delimiters
this is potentially easier and more flexible. I don't say this is a
particularly important argument, but there is a difference.
We are getting flak for not including the littelest argument in this RFC,
even though many things are quite obvious.
if we are going for completeness then I am going to write literally
everything down.
Easier machine parsing?
The RFC shows a list of different ways that attributes with the
@@
syntax can end, and claims "This makes programmatic token based
scanning for attribute syntax without a closing delimiter such as@@
unnecessarily complicated."But I've worked with userland token stream scanners myself, and it's
not difficult to skipT_WHITESPACE
andT_COMMENT
tokens. Once you do
that, parsing an attribute is as simple as finding anyT_ATTRIBUTE
token followed by the name token, then checking for an optional
argument list. If there's not an argument list, that's then end of
the attribute, otherwise the end is the end of the argument list.With the
@[]
and#[]
syntaxes, a userland token parser is actually
more complex due to grouping. It not only has to do the same things
listed above, but it also has to check whether there are multiple
comma-separated attributes between the start/end delimiters (making
sure not to confuse a comma-separated attribute with a comma-separated
argument, or the end of an array argument with the attribute end
delimiter).So I don't understand how the RFC can claim that attributes without
an end symbol "introduce additional complexity" for machines, when if
anything the opposite is true.(And don't get me started about the extra difficulty for token stream
scanners with the<<>>
syntax which has noT_ATTRIBUTE
token).Forcing @@ attributes to end with parenthesis?
I don't really see the point of this section in the RFC. What issue
would forcing an end parenthesis solve? And what does whitespace
between the attribute name and argument list have to do with anything?
Such whitespace is allowed with all of the proposed syntaxes.
I included this section because multiple people (Peter, Rowan, + more i
believe) suggested this as a compromise to keep @@ but fix the issues of
not having an ending delimiter.
The example shows how it does not guarantee an attribute could be scanned
as a whole block, due to the fact that you can have whitespaces in there.
I do agree, though, that requiring an end parenthesis for
@@
would
be inconsistent with object instantiation - that's one of the main
reasons I didn't require it in the Shorter Attribute Syntax RFC.
Exactly
Potential Future Benefits of Enclosed Delimiter Syntax?
The RFC shows an example of a potential "simpler" attribute using a
string instead of a class name. I honestly have no idea what this is
supposed to do or what benefit it would have over normal attributes.The concept of attributes being a class name with optional arguments
has been proven over many years by its use in docblock annotations,
and if there was some deficiency in what this syntax allows it seems
like we would have discovered it by now.
I agree on just the string, but a closure would make 100% sense for a
decorating
feature. Javascript and Python "Attributes" work as decorators, i.e. they
get called around the decorated function.
It is not a completely unrealistic feature to think off:
@[fn($x) => syslog(LOG_INFO, "Called function foo with x: " . $x)]
function foo($message) {}
Attribute nesting
The RFC points out that all the syntaxes can allow attribute nesting,
which is true. However, it would be nice to include an example of
potential future nesting for each syntax, as was included in the
original Shorter Attribute Syntax RFC. The reason is that some of the
syntaxes are less readable than others when nested (particularly<<>>
,
though arguably#[]
and@[]
as well since the attribute end
delimiter can be confused with the end bracket of an array argument.@@JoinTable( "User_Group", @@JoinColumn("User_id", "id"), @@JoinColumn("Group_id", "id"), ) private $groups; #[JoinTable( "User_Group", #[JoinColumn("User_id", "id")], #[JoinColumn("Group_id", "id")], )] private $groups; @[JoinTable( "User_Group", @[JoinColumn("User_id", "id")], @[JoinColumn("Group_id", "id")], )] private $groups; <<JoinTable( "User_Group", <<JoinColumn("User_id", "id")>>, <<JoinColumn("Group_id", "id")>>, )>> private $groups; @:JoinTable( "User_Group", @:JoinColumn("User_id", "id"), @:JoinColumn("Group_id", "id"), ) private $groups;
I wanted to skip adding this, because the RFC is already so long and this
is really sometihng that everyone can make up in their mind thinking about
it. I agree that with <<>> the nested syntax would be hard to stomach, but
for @@, @[] and #[] it is just using the same syntax that you prefer or not
prefer.
With appreciation,
Theodore
However, ending delimiters in PHP have little to do with how "complex"
a syntax construct is (which is a rather loose definition, anyway).
As I've pointed out before, standalone statements and declarations
generally require an end symbol, but modifiers before a declaration
do not. Attributes fall into the latter category, and therefore the
lack of an end delimiter is consistent.A docblock is also a "modifier" under your declaration and it has an
ending symbol.
The difference is that a docblock comment is also a standalone
declaration - it's quite common to add one at the top of a file
that doesn't modify any other declaration.
The RFC gives a definition of the complexity as just a token vs a
set of name, arugment_list and constant expression parser rules. It
shows an example porting an ORM\JoinTable Attribute, which has
arguments, named parameter usage, complex definitions of default
values (Strings, arrays).This piece of code probably touches 10-20 parser rules.
Most modifiers don't even have a parser rule, as they only match
their token.
In this comparison really the only "complex" part of an attribute is
the argument list, which already has its own start and end delimiters.
So I don't really see the need to add another end delimiter after the
argument list end delimiter.
Types are missing indeed, and they are more complex than a simple
token, but less complex than attribute declarations.I guess the difference is that union types are new, and type
definitions used to be simple. Attributes however are new and
already complex, so we still have the option of always enclosing
them.
An attribute without arguments has essentially the same complexity
that a type declaration has always had. The only part that is more
complex is the optional argument list, which as stated before has
its own start/end delimiters.
The RFC suggests a benefit of "Consistent colouring for being an
end of the attribute syntax and the keywords in between can use
different colors." I don't really understand this argument. How
would an end delimiter change the syntax highlighting provided by
IDEs?If you consider the three elements of an attribute declaration:
- Syntax for Attributes 2. Atttribute Name 3. Arguments then if
you color them in three different ways, then with an ending symbol
it improves the human readability to have the end be in the same
color [as] the beginning.
I see what you mean now. Personally I don't think a differently
colored end bracket will be particularly helpful to readability,
though. IDEs will already highlight the argument list start/end
delimiters, and the different coloring of an attribute name from
whatever token follows it will ensure readability whether there is
an argument list or not. Ultimately perspectives on readability will
differ, though, since it's a somewhat subjective consideration.
Potential Future Benefits of Enclosed Delimiter Syntax?
The RFC shows an example of a potential "simpler" attribute using a
string instead of a class name. I honestly have no idea what this is
supposed to do or what benefit it would have over normal attributes.The concept of attributes being a class name with optional arguments
has been proven over many years by its use in docblock annotations,
and if there was some deficiency in what this syntax allows it seems
like we would have discovered it by now.I agree on just the string, but a closure would make 100% sense for
a decorating feature. Javascript and Python "Attributes" work as
decorators, i.e. they get called around the decorated function.It is not a completely unrealistic feature to think off:
@[fn($x) => syslog(LOG_INFO, "Called function foo with x: " . $x)]
function foo($message) {}
As I understand it JavaScript decorators do not use anonymous
functions for decorators like this, though. Instead you would make a
named function and apply it with @myFunc()
before the decorated
function or class.
Presumably we could accomplish the same thing in PHP with e.g. an
__invoke
method in the attribute class, without complicating the
attribute syntax itself.
Best regards,
Theodore
On Mon, Aug 17, 2020 at 7:11 AM Benjamin Eberlei kontakt@beberlei.de
wrote:On Mon, Aug 17, 2020 at 3:06 AM Theodore Brown theodorejb@outlook.com
wrote:However, ending delimiters in PHP have little to do with how "complex"
a syntax construct is (which is a rather loose definition, anyway).
As I've pointed out before, standalone statements and declarations
generally require an end symbol, but modifiers before a declaration
do not. Attributes fall into the latter category, and therefore the
lack of an end delimiter is consistent.A docblock is also a "modifier" under your declaration and it has an
ending symbol.The difference is that a docblock comment is also a standalone
declaration - it's quite common to add one at the top of a file
that doesn't modify any other declaration.
Doesn't matter that you can add them anywhere.
Internally, doc comments (on structural elements) are stored and handled by
Reflection the same way that attributes are.
The RFC gives a definition of the complexity as just a token vs a
set of name, arugment_list and constant expression parser rules. It
shows an example porting an ORM\JoinTable Attribute, which has
arguments, named parameter usage, complex definitions of default
values (Strings, arrays).This piece of code probably touches 10-20 parser rules.
Most modifiers don't even have a parser rule, as they only match
their token.In this comparison really the only "complex" part of an attribute is
the argument list, which already has its own start and end delimiters.
So I don't really see the need to add another end delimiter after the
argument list end delimiter
Again, in the future we might introduce a new feature that might make
attributes have more complex parts than just an argument list. In this
case, @@
or @:
is only going to f*** us up.
Types are missing indeed, and they are more complex than a simple
token, but less complex than attribute declarations.I guess the difference is that union types are new, and type
definitions used to be simple. Attributes however are new and
already complex, so we still have the option of always enclosing
them.An attribute without arguments has essentially the same complexity
that a type declaration has always had. The only part that is more
complex is the optional argument list, which as stated before has
its own start/end delimiters.The RFC suggests a benefit of "Consistent colouring for being an
end of the attribute syntax and the keywords in between can use
different colors." I don't really understand this argument. How
would an end delimiter change the syntax highlighting provided by
IDEs?If you consider the three elements of an attribute declaration:
- Syntax for Attributes 2. Atttribute Name 3. Arguments then if
you color them in three different ways, then with an ending symbol
it improves the human readability to have the end be in the same
color [as] the beginning.I see what you mean now. Personally I don't think a differently
colored end bracket will be particularly helpful to readability,
though. IDEs will already highlight the argument list start/end
delimiters, and the different coloring of an attribute name from
whatever token follows it will ensure readability whether there is
an argument list or not. Ultimately perspectives on readability will
differ, though, since it's a somewhat subjective consideration.Potential Future Benefits of Enclosed Delimiter Syntax?
The RFC shows an example of a potential "simpler" attribute using a
string instead of a class name. I honestly have no idea what this is
supposed to do or what benefit it would have over normal attributes.The concept of attributes being a class name with optional arguments
has been proven over many years by its use in docblock annotations,
and if there was some deficiency in what this syntax allows it seems
like we would have discovered it by now.I agree on just the string, but a closure would make 100% sense for
a decorating feature. Javascript and Python "Attributes" work as
decorators, i.e. they get called around the decorated function.It is not a completely unrealistic feature to think off:
@[fn($x) => syslog(LOG_INFO, "Called function foo with x: " . $x)]
function foo($message) {}As I understand it JavaScript decorators do not use anonymous
functions for decorators like this, though. Instead you would make a
named function and apply it with@myFunc()
before the decorated
function or class.Presumably we could accomplish the same thing in PHP with e.g. an
__invoke
method in the attribute class, without complicating the
attribute syntax itself.
Best regards,
TheodoreTo unsubscribe, visit: https://www.php.net/unsub.php
Potential Future Benefits of Enclosed Delimiter Syntax?
The RFC shows an example of a potential "simpler" attribute using a
string instead of a class name. I honestly have no idea what this is
supposed to do or what benefit it would have over normal attributes.The concept of attributes being a class name with optional arguments
has been proven over many years by its use in docblock annotations,
and if there was some deficiency in what this syntax allows it seems
like we would have discovered it by now.I agree on just the string, but a closure would make 100% sense for
a decorating feature. Javascript and Python "Attributes" work as
decorators, i.e. they get called around the decorated function.It is not a completely unrealistic feature to think off:
@[fn($x) => syslog(LOG_INFO, "Called function foo with x: " . $x)]
function foo($message) {}As I understand it JavaScript decorators do not use anonymous
functions for decorators like this, though. Instead you would make a
named function and apply it with@myFunc()
before the decorated
function or class.Presumably we could accomplish the same thing in PHP with e.g. an
__invoke
method in the attribute class, without complicating the
attribute syntax itself.
One other thought on this. I agree that decorators are not a
completely unrealistic future feature. However, it must be noted that
both JavaScript and Python use the @Attr
syntax for decorators, and
the lack of an end delimiter in no way precludes this usage.
The whole point of a decorator is to offer syntax sugar for a common
reusable pattern (pass a function/class to another function which can
add additional information or behavior to it). It's not clear how an
anonymous closure would be useful for this, since it would not allow
reusability, which defeats the purpose.
So the argument that an end delimiter has "potential future benefits"
still lacks any realistic examples, and is countered by years of
proven usage of the @Attr
syntax in docblocks and other languages.
Sincerely,
Theodore
On Mon, Aug 17, 2020 at 5:
14 PM Theodore Brown theodorejb@outlook.com wrote:
On Mon, Aug 17, 2020 at 8:07 AM Theodore Brown theodorejb@outlook.com
wrote:On Mon, Aug 17, 2020 at 7:11 AM Benjamin Eberlei kontakt@beberlei.de
wrote:On Mon, Aug 17, 2020 at 3:06 AM Theodore Brown theodorejb@outlook.com
wrote:Potential Future Benefits of Enclosed Delimiter Syntax?
The RFC shows an example of a potential "simpler" attribute using a
string instead of a class name. I honestly have no idea what this is
supposed to do or what benefit it would have over normal attributes.The concept of attributes being a class name with optional arguments
has been proven over many years by its use in docblock annotations,
and if there was some deficiency in what this syntax allows it seems
like we would have discovered it by now.I agree on just the string, but a closure would make 100% sense for
a decorating feature. Javascript and Python "Attributes" work as
decorators, i.e. they get called around the decorated function.It is not a completely unrealistic feature to think off:
@[fn($x) => syslog(LOG_INFO, "Called function foo with x: " . $x)]
function foo($message) {}As I understand it JavaScript decorators do not use anonymous
functions for decorators like this, though. Instead you would make a
named function and apply it with@myFunc()
before the decorated
function or class.Presumably we could accomplish the same thing in PHP with e.g. an
__invoke
method in the attribute class, without complicating the
attribute syntax itself.One other thought on this. I agree that decorators are not a
completely unrealistic future feature. However, it must be noted that
both JavaScript and Python use the@Attr
syntax for decorators, and
the lack of an end delimiter in no way precludes this usage.
Yes they support decorators with @, but they don't support metadata.
With this syntax its either or, because from @Attr only you cannot decide
if its a decorator or a metadata attribute.
It would not work by detecting __invoke on the Attribute, because the whole
architecture of Attributes is based on deferring autoloading until
Reflection*::getAttributes().
But when you use decorators, you would need to know this at runtime, so the
zend_attribute datastructure would need to know its not an metadata
attribute,
but a decorator.
The whole point of a decorator is to offer syntax sugar for a common
reusable pattern (pass a function/class to another function which can
add additional information or behavior to it). It's not clear how an
anonymous closure would be useful for this, since it would not allow
reusability, which defeats the purpose.So the argument that an end delimiter has "potential future benefits"
still lacks any realistic examples, and is countered by years of
proven usage of the@Attr
syntax in docblocks and other languages.Sincerely,
Theodore
Potential Future Benefits of Enclosed Delimiter Syntax?
The RFC shows an example of a potential "simpler" attribute using a
string instead of a class name. I honestly have no idea what this is
supposed to do or what benefit it would have over normal attributes.The concept of attributes being a class name with optional arguments
has been proven over many years by its use in docblock annotations,
and if there was some deficiency in what this syntax allows it seems
like we would have discovered it by now.I agree on just the string, but a closure would make 100% sense for
a decorating feature. Javascript and Python "Attributes" work as
decorators, i.e. they get called around the decorated function.It is not a completely unrealistic feature to think off:
@[fn($x) => syslog(LOG_INFO, "Called function foo with x: " . $x)]
function foo($message) {}As I understand it JavaScript decorators do not use anonymous
functions for decorators like this, though. Instead you would make a
named function and apply it with@myFunc()
before the decorated
function or class.Presumably we could accomplish the same thing in PHP with e.g. an
__invoke
method in the attribute class, without complicating the
attribute syntax itself.One other thought on this. I agree that decorators are not a
completely unrealistic future feature. However, it must be noted that
both JavaScript and Python use the@Attr
syntax for decorators, and
the lack of an end delimiter in no way precludes this usage.Yes they support decorators with @, but they don't support metadata.
With this syntax its either or, because from @Attr only you cannot
decide if its a decorator or a metadata attribute.It would not work by detecting __invoke on the Attribute, because
the whole architecture of Attributes is based on deferring
autoloading until Reflection*::getAttributes(). But when you use
decorators, you would need to know this at runtime, so the
zend_attribute datastructure would need to know its not an metadata
attribute, but a decorator.
Hi Benjamin,
That's true. Due to deferred loading we would need some kind of
new syntax to denote checked attributes or decorators, regardless
of whether the attribute syntax has an end delimiter. As I've
suggested before, we could potentially denote checked attributes
in the future like this:
@@!Attr("some val")
function foo() {...}
I still believe that using an inline closure attribute syntax like
the example in the RFC would not be a good solution for decorators,
as it reduces reusability and readability, and would prevent applying
a decorator that includes metadata.
Best regards,
Theodore
Hi Benjamin,
Easier machine parsing?
The RFC shows a list of different ways that attributes with the
@@
syntax can end, and claims "This makes programmatic token based
scanning for attribute syntax without a closing delimiter such as@@
unnecessarily complicated."But I've worked with userland token stream scanners myself, and it's
not difficult to skipT_WHITESPACE
andT_COMMENT
tokens. Once you do
that, parsing an attribute is as simple as finding anyT_ATTRIBUTE
token followed by the name token, then checking for an optional
argument list. If there's not an argument list, that's then end of
the attribute, otherwise the end is the end of the argument list.With the
@[]
and#[]
syntaxes, a userland token parser is actually
more complex due to grouping. It not only has to do the same things
listed above, but it also has to check whether there are multiple
comma-separated attributes between the start/end delimiters (making
sure not to confuse a comma-separated attribute with a comma-separated
argument, or the end of an array argument with the attribute end
delimiter).So I don't understand how the RFC can claim that attributes without
an end symbol "introduce additional complexity" for machines, when if
anything the opposite is true.(And don't get me started about the extra difficulty for token stream
scanners with the<<>>
syntax which has noT_ATTRIBUTE
token).
I noticed you did not answer this point at all, I know there are lots of
emails to reply to but IMO this is quite an important dismissal of one
of the few technical arguments made for grouping, and also something I
tried to hint at on Twitter back on Sunday..
Reading the RFC again now, IMO the whole "Machine Scanning for End of
Attribute Declaration" section should be removed.
From the points left, only "Potential Future Benefits of Enclosed
Delimiter Syntax" is technically valid but really dependent on what we
see as interesting future use cases. The rest is rather subjective and
thus not really worth discussing, it'll be up to everyone's preference.
Best,
Jordi
--
Jordi Boggiano
@seldaek - https://seld.be
We have updated the RFC with all (hopefully) of the feedback from this
discussion:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Most notable changes are:
- A new section with several subsections on the benefits of a closing
delimiter / enclosing syntax.- A section on grouping pro/cons
- Inclusion of @: as per Theodores request
We are looking for further feedback from the community.
Thanks for the work. Looks good.
An idea.
Would the syntax @<Attr> be able to obtain a "No" on the "Breaks BC of
valid PHP 7 code" section while still being more or less the same as
#[Attr] or @[Attr] considering other features?
BTW, I'm thinking that it's good to have a "No" there.
Sorry if proposing another syntax is making this an even more complex problem.
Regards,
Alex
Hi,
Out of Banjamin's suggestion[1], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
FWIW, this has an excemption from the RM Sara as per [2]:
- Shorter Attribute Syntax Change
- Joe/Derick - Please make sure this RFC moves along and reaches
conclusion by beta3, as discussed previously.cheers,
Derick[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug--
To unsubscribe, visit: https://www.php.net/unsub.php
On Mon, Aug 17, 2020 at 10:59 AM Alexandru Pătrănescu drealecs@gmail.com
wrote:
On Sun, Aug 16, 2020 at 12:36 PM Benjamin Eberlei kontakt@beberlei.de
wrote:We have updated the RFC with all (hopefully) of the feedback from this
discussion:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Most notable changes are:
- A new section with several subsections on the benefits of a closing
delimiter / enclosing syntax.- A section on grouping pro/cons
- Inclusion of @: as per Theodores request
We are looking for further feedback from the community.
Thanks for the work. Looks good.
An idea.Would the syntax @<Attr> be able to obtain a "No" on the "Breaks BC of
valid PHP 7 code" section while still being more or less the same as
#[Attr] or @[Attr] considering other features?
BTW, I'm thinking that it's good to have a "No" there.Sorry if proposing another syntax is making this an even more complex
problem.
It is ok to propose another syntax, at this point in time we are working
around the @ and [] symbols, because of their familiarity with other
languages attribute syntax.
There is probably 100 potential syntaxes that we could use, @<> is a bit
hard on the eyes as is <<>>, so i wouldn't call it a game changer in
contrast to what we have already, so I would rather not include it.
Regards,
AlexHi,
Out of Banjamin's suggestion[1], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
FWIW, this has an excemption from the RM Sara as per [2]:
- Shorter Attribute Syntax Change
- Joe/Derick - Please make sure this RFC moves along and reaches
conclusion by beta3, as discussed previously.cheers,
Derick[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug--
To unsubscribe, visit: https://www.php.net/unsub.php
As a possible addition/discussion point, I only noticed today that @{}
is a syntax that has not been mentioned yet, also not in any previous
discussions about attributes as far as I can tell. @{} currently leads
to a syntax error, so there is no BC break, and {} is common syntax for
grouping expressions in PHP, much more so than [], which is an
array-specific syntax.
Would it be a possibility to keep @@ and add @{} as a second syntax for
attributes, that can be used for grouping (for situations where that
makes sense) or other possibly future extensions? Then @@ would be a
good syntax for simple attribute definitions, and @{} could be an
alternative for people who want to group them or if any more complex
attribute features are added to the language later.
Because both sides of the "ending delimiter or no ending delimiter"
discussion do have some points in their favor, and it seems quite
individual what each person prefers. For a language it could be
beneficial to give some choices to the developer instead of foreseeing
each individual use case, and maybe attributes is such a feature.
I previously thought about suggesting both types of syntax (with and
without delimiters), but felt the current options all have too many side
effects to choose "two side effects" or two BC breaks. But the @@ BC
break seems the most harmless BC break of the bunch, and @{} does not
have a BC break, so these two option might be good together.
possibility to keep @@ and add @{} as a second syntax for attributes
+1, but I would keep same prefix, ie. @@{} (or @@[]), for both syntaxes,
it is much easier for human eyes to search for one thing, also easier
for grep
With kind regards / Mit freundlichen Grüßen / S přátelským pozdravem,
Michael Voříšek
As a possible addition/discussion point, I only noticed today that @{}
is a syntax that has not been mentioned yet, also not in any previous
discussions about attributes as far as I can tell. @{} currently leads
to a syntax error, so there is no BC break, and {} is common syntax for
grouping expressions in PHP, much more so than [], which is an
array-specific syntax.Would it be a possibility to keep @@ and add @{} as a second syntax for
attributes, that can be used for grouping (for situations where that
makes sense) or other possibly future extensions? Then @@ would be a
good syntax for simple attribute definitions, and @{} could be an
alternative for people who want to group them or if any more complex
attribute features are added to the language later.Because both sides of the "ending delimiter or no ending delimiter"
discussion do have some points in their favor, and it seems quite
individual what each person prefers. For a language it could be
beneficial to give some choices to the developer instead of foreseeing
each individual use case, and maybe attributes is such a feature.I previously thought about suggesting both types of syntax (with and
without delimiters), but felt the current options all have too many side
effects to choose "two side effects" or two BC breaks. But the @@ BC
break seems the most harmless BC break of the bunch, and @{} does not
have a BC break, so these two option might be good together.--
To unsubscribe, visit: https://www.php.net/unsub.php
possibility to keep @@ and add @{} as a second syntax for attributes
+1, but I would keep same prefix, ie. @@{} (or @@[]), for both syntaxes,
it is much easier for human eyes to search for one thing, also easier
for grepAs a possible addition/discussion point, I only noticed today that @{}
is a syntax that has not been mentioned yet, also not in any previous
discussions about attributes as far as I can tell. @{} currently leads
to a syntax error, so there is no BC break, and {} is common syntax for
grouping expressions in PHP, much more so than [], which is an
array-specific syntax.Would it be a possibility to keep @@ and add @{} as a second syntax for
attributes, that can be used for grouping (for situations where that
makes sense) or other possibly future extensions? Then @@ would be a
good syntax for simple attribute definitions, and @{} could be an
alternative for people who want to group them or if any more complex
attribute features are added to the language later.Because both sides of the "ending delimiter or no ending delimiter"
discussion do have some points in their favor, and it seems quite
individual what each person prefers. For a language it could be
beneficial to give some choices to the developer instead of foreseeing
each individual use case, and maybe attributes is such a feature.I previously thought about suggesting both types of syntax (with and
without delimiters), but felt the current options all have too many side
effects to choose "two side effects" or two BC breaks. But the @@ BC
break seems the most harmless BC break of the bunch, and @{} does not
have a BC break, so these two option might be good together.
Supporting both @@Foo and @@{ Foo } sounds really nice on the surface as a compromise, but runs into the problem of any 3rd party parsers now needing to do extra work as well. Minimizing work for 3rd party parsers is one of the main goals under discussion, as I understand it. I'm not sure it's viable, therefore, much as it does have its appeal conceptually.
--Larry Garfield
We have updated the RFC with all (hopefully) of the feedback from this
discussion:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Most notable changes are:
- A new section with several subsections on the benefits of a closing
delimiter / enclosing syntax.- A section on grouping pro/cons
- Inclusion of @: as per Theodores request
We are looking for further feedback from the community.
From the updated RFC:
There are multiple reasons why we believe the previous vote should be revisited:
Ok, bring it on!
At the point of the vote for @@, it was not clear that the syntax required the namespace token RFC to be viable.
While this is not a problem anymore, the @@ syntax might not have come out on top if this information was known beforehand.
If anything, this is an argument AGAINST this RFC. A "bad" decision
was taken. The problem with it was fixed. No need to change anything.
The argument comes across as disingenuous, I'm afraid.
Moving on...
The #[] syntax provides the benefit of forward compatibility, but this also introduces some potential problems for PHP 7 code.
An alternative syntax @[] was suggested to eleviate these problems which was not previously voted on.
Ok, let's analyze the logic here as well: #[] lost the vote. #[] would
have had some problems. Are there any syntaxes we still haven't voted
on? Yes!
Come on...
And lastly...
We argue why we should strongly favor a syntax with closing delimiter to keep consistency with other parts
of the language and propose to use #[], @[], or the original << … >> instead.
This is the only part that contains logically valid arguments, albeit
most are subjective and speculative. Which is not to say it's not
worth voting on them.
But looking for actual facts, I only came across only this little cutie:
For VIM users, the % operation to jump between opening and closing part of declaration that would automatically work with [ and ].
I fully expect all 3 VIM users to vote in favor of this RFC ;-)
Ok, enough of my sarcasm - I only wish you'd put your strongest
arguments first and focused on quality over quantity.
- Jakob
On Sun, Aug 16, 2020 at 11:36 AM Benjamin Eberlei kontakt@beberlei.de
wrote:We have updated the RFC with all (hopefully) of the feedback from this
discussion:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Most notable changes are:
- A new section with several subsections on the benefits of a closing
delimiter / enclosing syntax.- A section on grouping pro/cons
- Inclusion of @: as per Theodores request
We are looking for further feedback from the community.
From the updated RFC:
There are multiple reasons why we believe the previous vote should be
revisited:Ok, bring it on!
At the point of the vote for @@, it was not clear that the syntax
required the namespace token RFC to be viable.
While this is not a problem anymore, the @@ syntax might not have come
out on top if this information was known beforehand.If anything, this is an argument AGAINST this RFC. A "bad" decision
was taken. The problem with it was fixed. No need to change anything.
The argument comes across as disingenuous, I'm afraid.
And then boo-yah, 6 months later we want to implement a cool new feature to
attributes (a lot of examples were said before, ain't repeating myself) but
we can't :(( because there is no ending delimiter and thus, we will run
into parsing issues.
Moving on...
The #[] syntax provides the benefit of forward compatibility, but this
also introduces some potential problems for PHP 7 code.
An alternative syntax @[] was suggested to eleviate these problems which
was not previously voted on.Ok, let's analyze the logic here as well: #[] lost the vote. #[] would
have had some problems. Are there any
What problems? Besides the BC breaks that all of the syntaxes (except
<<...>>
) have, there are no problems.
syntaxes we still haven't voted
on? Yes!
Come on...And lastly...
We argue why we should strongly favor a syntax with closing delimiter to
keep consistency with other parts
of the language and propose to use #[], @[], or the original << … >>
instead.This is the only part that contains logically valid arguments, albeit
most are subjective and speculative. Which is not to say it's not
worth voting on them.
But looking for actual facts, I only came across only this little cutie:For VIM users, the % operation to jump between opening and closing part
of declaration that would automatically work with [ and ].
I fully expect all 3 VIM users to vote in favor of this RFC ;-)Ok, enough of my sarcasm - I only wish you'd put your strongest
arguments first and focused on quality over quantity.
I wish someone actually gave reasonable arguments as to why @@
is better.
Because a) no one cares if we have to type 2 or 3 characters b) @@
does
not ensure 100% safe future c) it does not decrease complexity in any way.
- Jakob
--
To unsubscribe, visit: https://www.php.net/unsub.php
And then boo-yah, 6 months later we want to implement a cool new
feature to
attributes (a lot of examples were said before, ain't repeating myself) but
we can't :(( because there is no ending delimiter and thus, we will run
into parsing issues.
Both @{} and @@{} would be possible as a future extension of the syntax
and would have no BC break at all, if extending the syntax is something
that would/should happen - just as possible suggestions.
It is likely though that the vast majority of attribute usage will be
quite simple (like the ones we have today with annotations: for routes,
for validation, for ORMs), so having a simple syntax for a feature which
is mostly used in a straightforward way does not seem that crazy.
And about your condescending remark of people trying to add to the
discussion who have not "proven themselves in the PHP source code":
Having a discussion with people who have different viewpoints seems like
a big benefit for any project, because it is impossible to be an expert
at C code, php-src, PHP code, all PHP frameworks, all the PHP libraries,
and all the ways PHP is used today - yet all that can be relevant for
language changes and the actual usage of new features, including the syntax.
And then boo-yah, 6 months later we want to implement a cool new
feature to
attributes (a lot of examples were said before, ain't repeating myself)
but
we can't :(( because there is no ending delimiter and thus, we will run
into parsing issues.Both @{} and @@{} would be possible as a future extension of the syntax
and would have no BC break at all, if extending the syntax is something
that would/should happen - just as possible suggestions.
Introducing @@{}
would:
- be against
@@
"conciseness" ideology and would be longer than
@[]
/#[]
- what's the point of creating a new syntax if we can just pick
@[]
/#[]
?
It is likely though that the vast majority of attribute usage will be
quite simple (like the ones we have today with annotations: for routes,
for validation, for ORMs), so having a simple syntax for a feature which
is mostly used in a straightforward way does not seem that crazy.
"It is likely" is key here. So far, the only "positive" thing I have seen
about @@
is smaller BC break which is albeit questionable since I was
able to find only 2 instances of a BC break for @[]
(when searching top
Composer packages).
As for other "pros", let's be honest, no one cares that @@
is 2
characters whereas @[]
is 3 characters.
And about your condescending remark of people trying to add to the
discussion who have not "proven themselves in the PHP source code":
Having a discussion with people who have different viewpoints seems like
a big benefit for any project, because it is impossible to be an expert
At the end of the day, the so called "experts" are maintaining PHP source
code.
Having an opinion is okay but being ignorant about the issues which might
arise to the maintainers is completely unacceptable.
at C code, php-src, PHP code, all PHP frameworks, all the PHP libraries,
and all the ways PHP is used today - yet all that can be relevant for
language changes and the actual usage of new features, including the
syntax.
Best regards,
Benas
From the updated RFC:
There are multiple reasons why we believe the previous vote should be revisited:
Ok, bring it on!
At the point of the vote for @@, it was not clear that the syntax required the namespace token RFC to be viable.
While this is not a problem anymore, the @@ syntax might not have come out on top if this information was known beforehand.If anything, this is an argument AGAINST this RFC. A "bad" decision
was taken. The problem with it was fixed. No need to change anything.
The argument comes across as disingenuous, I'm afraid.And then boo-yah, 6 months later we want to implement a cool new feature to attributes
(a lot of examples were said before, ain't repeating myself) but we can't :(( because there is no ending delimiter and thus, we will run into parsing issues.
Don't really understand how that is a response to my argument.
However, I understand your opinion, I just find it hard to find
convincing evidence in support of it in this RFC.
Moving on...
The #[] syntax provides the benefit of forward compatibility, but this also introduces some potential problems for PHP 7 code.
An alternative syntax @[] was suggested to eleviate these problems which was not previously voted on.Ok, let's analyze the logic here as well: #[] lost the vote. #[] would
have had some problems. Are there anyWhat problems? Besides the BC breaks that all of the syntaxes (except
<<...>>
) have, there are no problems.
I'm just quoting the RFC here, then paraphrasing. If you want to know
what "potential problems" #[] introduces for PHP7 code, you'll have to
ask the authors of the RFC.
syntaxes we still haven't voted
on? Yes!
Come on...And lastly...
We argue why we should strongly favor a syntax with closing delimiter to keep consistency with other parts
of the language and propose to use #[], @[], or the original << … >> instead.This is the only part that contains logically valid arguments, albeit
most are subjective and speculative. Which is not to say it's not
worth voting on them.
But looking for actual facts, I only came across only this little cutie:For VIM users, the % operation to jump between opening and closing part of declaration that would automatically work with [ and ].
I fully expect all 3 VIM users to vote in favor of this RFC ;-)Ok, enough of my sarcasm - I only wish you'd put your strongest
arguments first and focused on quality over quantity.I wish someone actually gave reasonable arguments as to why
@@
is better. Because a) no one cares if we have to type 2 or 3 characters b)@@
does not ensure 100% safe future c) it does not decrease complexity in any way.
@@ already won the vote. The burden of proof for superseding the
popular vote should be on the RFC authors. But for the record, I
visually and mentally like all the examples with @@ more than their
block-syntax counterparts. As I said previously; without hard facts,
it's just a subjective matter. If I'm a weirdo for actually liking @@
I'm not sorry :-D
Best,
Jakob
Hi,
Out of Banjamin's suggestion[1], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
FWIW, this has an excemption from the RM Sara as per [2]:
- Shorter Attribute Syntax Change
- Joe/Derick - Please make sure this RFC moves along and reaches
conclusion by beta3, as discussed previously.Heads up: This RFC is now going to vote tomorrow:
https://wiki.php.net/rfc/shorter_attribute_syntax_change
I have updated the RFC one last time with as much of the feedback as
possible:
- a section about comparing to complexity of type definitions
- removal of the machine reading section as too narrow and ultimately not
that important as downstream libraries just have to deal with any of it - some more nuances in forward compatibility pro/cons section of #[]
- smaller corrections and improvements.
I don't think something major is missing now.
cheers,
Derick[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug--
To unsubscribe, visit: https://www.php.net/unsub.php
https://wiki.php.net/rfc/shorter_attribute_syntax_change
I have updated the RFC one last time with as much of the feedback
as possible:
- a section about comparing to complexity of type definitions
- removal of the machine reading section as too narrow and
ultimately not that important as downstream libraries just have to
deal with any of it- some more nuances in forward compatibility pro/cons section of #[]
- smaller corrections and improvements.
I don't think something major is missing now.
Hi Benjamin,
Thanks for the updates. I just have a few more thoughts on aspects
that haven't been mentioned before:
- The Attributes are not like Modifiers section makes an
argument that having an end delimiter "groups docblock comment and
attributes into two similarly shaped syntax blocks that prefix the
declaration increasing familiarity."
In my own (admittedly subjective) opinion, an end delimiter on
attributes actually increases confusion when there is also a
docblock. To reuse the example from the RFC:
/**
* A comment describing things.
*
* @psalm-suppress SomeRule
*/
#[
ORM\Entity(),
ORM\Table("baz")
]
final class Something {
}
Because the attribute group has its own start and end delimiters, it
almost looks like the doc comment applies to the attribute block
rather than the class.
With the @@
or @:
syntax, it seems clearer that attributes are
part of the class/function/property declaration, rather than their
own standalone construct which docblocks can be applied to:
/**
* A comment describing things.
*
* @psalm-suppress SomeRule
*/
@@ORM\Entity
@@ORM\Table("baz")
final class Something {
}
Given that the only complex part of an attribute is the optional
argument list, which already has its own start/end delimiters, I
ultimately don't find the "complexity" argument very compelling for
needing an additional attribute end delimiter besides.
- In the Discussion on grep'ability section, the RFC says
"Enforcement of same line is also not the case for other
declarations that benefit from grep'ability such as classes,
functions, constants and so on in PHP already, so this is not
consistent within the language."
This seems to be outdated information, based on Martin's original
patch before the "Treat namespaced names as single token" RFC was
accepted. In the current @@
implementation, there is no single-line
enforcement, consistent with other parts of the language.
Not having whitespace between the attribute token and name would be
enforced by coding style conventions, just as is the case with
function/class/constant definitions.
Note that there is some precedent in PHP for choosing syntax that
ensures easier searching (for example, the decision to place return
type declarations after the parameter list rather than before the
function name).
Grep'ability isn't a big deal when finding usages in an IDE, but
sometimes there is a need to search code on a server or other source
without an IDE, in which case easy grep'ability can be very helpful.
Sincerely,
Theodore
On Wed, Aug 19, 2020 at 12:03 AM Theodore Brown theodorejb@outlook.com
wrote:
On Tue, Aug 18, 2020 at 1:00 PM Benjamin Eberlei kontakt@beberlei.de
wrote:https://wiki.php.net/rfc/shorter_attribute_syntax_change
I have updated the RFC one last time with as much of the feedback
as possible:
- a section about comparing to complexity of type definitions
- removal of the machine reading section as too narrow and
ultimately not that important as downstream libraries just have to
deal with any of it- some more nuances in forward compatibility pro/cons section of #[]
- smaller corrections and improvements.
I don't think something major is missing now.
Hi Benjamin,
Thanks for the updates. I just have a few more thoughts on aspects
that haven't been mentioned before:
- The Attributes are not like Modifiers section makes an
argument that having an end delimiter "groups docblock comment and
attributes into two similarly shaped syntax blocks that prefix the
declaration increasing familiarity."In my own (admittedly subjective) opinion, an end delimiter on
attributes actually increases confusion when there is also a
docblock. To reuse the example from the RFC:/** * A comment describing things. * * @psalm-suppress SomeRule */ #[ ORM\Entity(), ORM\Table("baz") ] final class Something { }
Because the attribute group has its own start and end delimiters, it
almost looks like the doc comment applies to the attribute block
rather than the class.With the
@@
or@:
syntax, it seems clearer that attributes are
part of the class/function/property declaration, rather than their
own standalone construct which docblocks can be applied to:/** * A comment describing things. * * @psalm-suppress SomeRule */ @@ORM\Entity @@ORM\Table("baz") final class Something { }
Given that the only complex part of an attribute is the optional
argument list, which already has its own start/end delimiters, I
ultimately don't find the "complexity" argument very compelling for
needing an additional attribute end delimiter besides.
- In the Discussion on grep'ability section, the RFC says
"Enforcement of same line is also not the case for other
declarations that benefit from grep'ability such as classes,
functions, constants and so on in PHP already, so this is not
consistent within the language."This seems to be outdated information, based on Martin's original
patch before the "Treat namespaced names as single token" RFC was
accepted. In the current@@
implementation, there is no single-line
enforcement, consistent with other parts of the language.
Right, i didn't realize this restriction was lifted and updated this
section.
This doesn't change the argument though that when you need coding styles to
enforce a particular style that grepability works, then you can find a
coding standard with all syntaxes that has good grepability, i.e. by not
using grouping.
Not having whitespace between the attribute token and name would be
enforced by coding style conventions, just as is the case with
function/class/constant definitions.Note that there is some precedent in PHP for choosing syntax that
ensures easier searching (for example, the decision to place return
type declarations after the parameter list rather than before the
function name).Grep'ability isn't a big deal when finding usages in an IDE, but
sometimes there is a need to search code on a server or other source
without an IDE, in which case easy grep'ability can be very helpful.Sincerely,
Theodore
Hi,
https://wiki.php.net/rfc/shorter_attribute_syntax_change
I have updated the RFC one last time with as much of the feedback as
possible:
- a section about comparing to complexity of type definitions
- removal of the machine reading section as too narrow and ultimately not
that important as downstream libraries just have to deal with any of it- some more nuances in forward compatibility pro/cons section of #[]
- smaller corrections and improvements.
I don't think something major is missing now.
Thanks for the updates Benjamin.
Just to mention something here in a bit more depth because it is easy to
overlook in the RFC if you have looked at it a lot.
In "Potential Future Benefits of Enclosed Delimiter Syntax" there is an
addition of an example using an attribute for an AOP-style
before-function callback:
@:Before(fn ($x) => $x*4)
IMO this is much more readable and self-documenting than a dangling
lambda like @[fn ($x) => %x*4], as the attribute name hints at what is
going on, and it provides enclosure with the arg list ().
I hope this will address the worries that the shorter @@/@: syntaxes
would prevent us from adding some features later based on a lack of end
delimiter, as it was the only objective technical argument in favor of
#[]/@[].
Now it's IMO all about what syntax people prefer visually..
Best,
Jordi
--
Jordi Boggiano
@seldaek - https://seld.be
Just to mention something here in a bit more depth because it is easy to
overlook in the RFC if you have looked at it a lot.In "Potential Future Benefits of Enclosed Delimiter Syntax" there is an
addition of an example using an attribute for an AOP-style
before-function callback:@:Before(fn ($x) => $x*4)
IMO this is much more readable and self-documenting than a dangling
lambda like @[fn ($x) => %x*4], as the attribute name hints at what is
going on, and it provides enclosure with the arg list ().
I read a lot of code I didn't write, and I like your example. It is much
more readable and self-documenting.
Peter
On Tue, Aug 18, 2020 at 8:00 PM Benjamin Eberlei kontakt@beberlei.de
wrote:
Hi,
Out of Banjamin's suggestion[1], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
FWIW, this has an excemption from the RM Sara as per [2]:
- Shorter Attribute Syntax Change
- Joe/Derick - Please make sure this RFC moves along and reaches
conclusion by beta3, as discussed previously.Heads up: This RFC is now going to vote tomorrow:
https://wiki.php.net/rfc/shorter_attribute_syntax_change
I have updated the RFC one last time with as much of the feedback as
possible:
- a section about comparing to complexity of type definitions
- removal of the machine reading section as too narrow and ultimately not
that important as downstream libraries just have to deal with any of it- some more nuances in forward compatibility pro/cons section of #[]
- smaller corrections and improvements.
I don't think something major is missing now.
One last change that I didn't see yesterday as it was on Github and not
this list is the addition of another syntax proposal @{} with the same
benefits as @[], a little more snowflake than compared to other languages,
but without the BC Break.
cheers,
Derick[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug--
To unsubscribe, visit: https://www.php.net/unsub.php
One last change that I didn't see yesterday as it was on Github and not
this list is the addition of another syntax proposal @{} with the same
benefits as @[], a little more snowflake than compared to other languages,
but without the BC Break.
I mentioned the benefits of @{} in an email to this list on Monday, with
the proposal to have both @@ and @{} as attribute syntax, so both camps
could have their syntax (one with delimiters, one without) with minimal
BC breaks, and leave the decision to the PHP developers/projects what
they prefer in what circumstances, because there can be valid reasons to
use both - I probably would use both. @{} could be good to define
multiple attributes for classes/properties, @@ could be good for short
attributes or ones very entrenched within the code, like function
parameters. The @{} syntax could be amended in the future, so this would
also be "future-proof".
But I guess the division about syntax is too big at this point to
consider an approach where we just offer both types of syntax. From a
PHP developer viewpoint, it would be preferable though.
Hi Andreas,
I mentioned the benefits of @{} in an email to this list on Monday, with
the proposal to have both @@ and @{} as attribute syntax, so both camps
could have their syntax (one with delimiters, one without) with minimal
Please, one and only syntax would be plenty. We have history showing
that having two was not a brilliant idea, i.e. string offsets.
But I guess the division about syntax is too big at this point to
consider an approach where we just offer both types of syntax. From a
PHP developer viewpoint, it would be preferable though.
To each their own. From my viewpoint, and possibly quite a few other's,
having two syntaxes is not preferable.
Cheers
Matteo Beccati
Development & Consulting - http://www.beccati.com/
On Wed, Aug 19, 2020 at 11:01 AM Andreas Leathley a.leathley@gmx.net
wrote:
One last change that I didn't see yesterday as it was on Github and not
this list is the addition of another syntax proposal @{} with the same
benefits as @[], a little more snowflake than compared to other
languages,
but without the BC Break.I mentioned the benefits of @{} in an email to this list on Monday, with
the proposal to have both @@ and @{} as attribute syntax, so both camps
could have their syntax (one with delimiters, one without) with minimal
BC breaks, and leave the decision to the PHP developers/projects what
they prefer in what circumstances, because there can be valid reasons to
use both - I probably would use both. @{} could be good to define
multiple attributes for classes/properties, @@ could be good for short
attributes or ones very entrenched within the code, like function
parameters. The @{} syntax could be amended in the future, so this would
also be "future-proof".But I guess the division about syntax is too big at this point to
consider an approach where we just offer both types of syntax. From a
PHP developer viewpoint, it would be preferable though.
The "problem" with having both @@ and @{} would be that we would need two
new tokens instead of one.
We have a bunch of proposals that would support both grouped and ungrouped
with the same syntax, so a solution that ends up ending two new tokens and
syntaxes would be less preferable.
With the choice being @@ or @{} - nothing would stop someone (not me ;-))
to make an RFC for 8.1 or later proposing to add a second syntax.
With the choice being @@ or @{} - nothing would stop someone (not me ;-))
to make an RFC for 8.1 or later proposing to add a second syntax.
Sure. If @@ would end up winning again (who knows at this point), at
least one positive thing is that @{} could be added later without having
a BC break, which reduces the potential future benefits of an enclosed
syntax, as it is still possible if needed.
Please add discussion about merge conflicts. Any inline grouped
attribute syntax needs a manual conflict resolution.
With ungrouped syntax, I expect recommended CS to be one attribute per
line.
If this should be the case also for grouped syntax, then it not +1
character, but +2 new lines per every annotated element.
Also, is 2/3 majority required by RFC rules satisfied by the "Are you
okay with re-voting on the attribute syntax for PHP 8.0, again?"
question?
I think we should require 2/3 votes at least on the question if we
should allow grouping or not and if accepted, use STV results on the
prefered prefix symbols/syntax.
With kind regards / Mit freundlichen Grüßen / S přátelským pozdravem,
Michael Voříšek
On Tue, Aug 18, 2020 at 8:00 PM Benjamin Eberlei kontakt@beberlei.de
wrote:Hi,
Out of Banjamin's suggestion[1 [1]], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
FWIW, this has an excemption from the RM Sara as per [2 [2]]:
- Shorter Attribute Syntax Change
- Joe/Derick - Please make sure this RFC moves along and reaches
conclusion by beta3, as discussed previously.
Heads up: This RFC is now going to vote tomorrow:
https://wiki.php.net/rfc/shorter_attribute_syntax_change
I have updated the RFC one last time with as much of the feedback as
possible:
- a section about comparing to complexity of type definitions
- removal of the machine reading section as too narrow and ultimately
not
that important as downstream libraries just have to deal with any of it - some more nuances in forward compatibility pro/cons section of #[]
- smaller corrections and improvements.
I don't think something major is missing now.
One last change that I didn't see yesterday as it was on Github and not
this list is the addition of another syntax proposal @{} with the same
benefits as @[], a little more snowflake than compared to other
languages,
but without the BC Break.
cheers,
Derick[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug--
To unsubscribe, visit: https://www.php.net/unsub.php
Links:
[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286
On Wed, Aug 19, 2020 at 11:13 AM Michael Voříšek - ČVUT FEL <
vorismi3@fel.cvut.cz> wrote:
Please add discussion about merge conflicts. Any inline grouped
attribute syntax needs a manual conflict resolution.With ungrouped syntax, I expect recommended CS to be one attribute per
line.
This is discussed under grouping already. It is a coding style issue, so
it's not really relevant as you can use all the syntaxes in an ungrouped
mode if you are concerned about conflicts.
If this should be the case also for grouped syntax, then it not +1
character, but +2 new lines per every annotated element.Also, is 2/3 majority required by RFC rules satisfied by the "Are you
okay with re-voting on the attribute syntax for PHP 8.0, again?"
question?
I think we should require 2/3 votes at least on the question if we
should allow grouping or not and if accepted, use STV results on the
prefered prefix symbols/syntax.
Yes, that was exactly the same type of vote for "shorter attribute syntax"
RFC.
With kind regards / Mit freundlichen Grüßen / S přátelským pozdravem,
Michael Voříšek
On Tue, Aug 18, 2020 at 8:00 PM Benjamin Eberlei kontakt@beberlei.de
wrote:Hi,
Out of Banjamin's suggestion[1 [1]], I've updated the Shorter Attribute
Syntax Change RFC to reflect that process:https://wiki.php.net/rfc/shorter_attribute_syntax_change
Patches and comments welcome.
FWIW, this has an excemption from the RM Sara as per [2 [2]]:
- Shorter Attribute Syntax Change
- Joe/Derick - Please make sure this RFC moves along and reaches
conclusion by beta3, as discussed previously.
Heads up: This RFC is now going to vote tomorrow:https://wiki.php.net/rfc/shorter_attribute_syntax_change
I have updated the RFC one last time with as much of the feedback as
possible:
- a section about comparing to complexity of type definitions
- removal of the machine reading section as too narrow and ultimately
not
that important as downstream libraries just have to deal with any of it- some more nuances in forward compatibility pro/cons section of #[]
- smaller corrections and improvements.
I don't think something major is missing now.
One last change that I didn't see yesterday as it was on Github and not
this list is the addition of another syntax proposal @{} with the same
benefits as @[], a little more snowflake than compared to other
languages,
but without the BC Break.cheers,
Derick[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286--
PHP 7.4 Release Manager
Host of PHP Internals News: https://phpinternals.news
Like Xdebug? Consider supporting me: https://xdebug.org/support
https://derickrethans.nl | https://xdebug.org | https://dram.io
twitter: @derickr and @xdebug--
To unsubscribe, visit: https://www.php.net/unsub.php
Links:
[1] https://externals.io/message/111218#111261
[2] https://externals.io/message/111286#111286