Hi internals,
I've started voting on "PHP Attributes" RFC.
https://wiki.php.net/rfc/attributes
In my opinion, "PHP Attributes" might be a smart tool for PHP extension, but it's not going to be the end of the world, if we decided to live with doc-comments only.
Thanks. Dmitry.
Hi internals,
I've started voting on "PHP Attributes" RFC.
https://wiki.php.net/rfc/attributes
In my opinion, "PHP Attributes" might be a smart tool for PHP extension, but it's not going to be the end of the world, if we decided to live with doc-comments only.
I hope it's going to be negative. The name is misleading and the AST
approach is not really useful in userland. :(
--
Richard "Fleshgrinder" Fussenegger
A couple of quick comments - I'm sorry, I haven't had time to get them
in before now.
In my opinion, this is pretty bad, for one primary reason: these are
just names and values.
The advantage of this over parsing doc-blocks at run-time is pretty
limited - you can basically only guarantee syntax, you can't guarantee
anything about annotation types or the required arguments. Names and
values still need to be resolved at run-time - that seems really
brittle and redundant.
It's also not what the community wants - they want classes, e.g.
Doctrine annotations, the most popular choice:
https://github.com/doctrine/annotations
Or the project that I started (but no longer contribute to)
https://github.com/php-annotations/php-annotations/
We want classes for the same reason we don't want arrays with magical
key/value pairs - for example, so we can have static analysis,
inspections, auto-completion in IDEs, etc.
Annotations need more consideration for design time - run time
attributes, in my opinion, is not enough, and brings more net
complexity than actual annotations.
Because no behavior or coupling is defined, they won't behave well,
and the coupling will be unpredictable - we'll have lots of
frameworks, all doing things differently, which is the same situation
we have now.
In my opinion, if we need this functionality at all, we need real
annotations - not just new syntax for the data, but taking into
account the behavior.
I think annotations could be as simple as this:
https://gist.github.com/mindplay-dk/ebd5e4f7da51da3c4e56232adef41b46
In my opinion, this immediately solves a lot more problems with a lot
less effort (and fragmentation!) in userland.
It's immediately useful in any script, without having to select and
install a third-party Composer package or write complex code to
interpret the data.
As for "softer" and more complex rules, e.g. regarding the number of
allowed annotations of the same type, or the type of element they're
allowed on, etc. - it doesn't make much sense to try to implement or
enforce such rules, as these wouldn't be enforced until the moment you
actually query the annotations of an element anyhow. This could be
either left up to userland, e.g. consumers can easily check and
enforce constraints themselves using conditionals and exceptions.
As for single vs multiple annotations of the same type, I would ignore
this as well, for the same reason - even if you had an API like
getSingleAnnotation($type) this would have to return either an
instance of $type, or null, so the consumer is still left with the
burden of having to check the result, e.g. no more or less of a burden
than checking the number of returned annotations with count()
.
To summarize:
- Annotations are immediately useful in any script
- Annotations are coupled directly to classes
- Classes is what most of us want in the end
- Static type-checking is possible
I think that attributes are not the way to go about this - it's not
substantially better than the status quo and doesn't lead to anything
immediately useful to most developers without also
adopting/writing/learning a suitable framework.
Just my opinions.
Hi internals,
I've started voting on "PHP Attributes" RFC.
https://wiki.php.net/rfc/attributes
In my opinion, "PHP Attributes" might be a smart tool for PHP extension, but it's not going to be the end of the world, if we decided to live with doc-comments only.
Thanks. Dmitry.
Hi internals,
I've started voting on "PHP Attributes" RFC.
https://wiki.php.net/rfc/attributes
In my opinion, "PHP Attributes" might be a smart tool for PHP extension,
but it's not going to be the end of the world, if we decided to live with
doc-comments only.
one question, Rasmus Schultz post goes into the similar direction.
Any reason why the annotations are only a numeric list and not key value
pairs? Key-Value would be much more powerful and address a ton of
objections for us (Doctrine).
In the current state it is pretty limited for more complex use-cases. I
don't want to fully embrace the complexities that Larry showed for Drupal
(in my opinion, too much annotations), but without key value pairs we could
only use this when we nested JSON into the attribute value strings for
example, not something I want to mix.
Thanks. Dmitry.
On Tue, May 10, 2016 at 8:29 PM, Dmitry Stogov <dmitry@zend.com
mailto:dmitry@zend.com> wrote:Hi internals, I've started voting on "PHP Attributes" RFC. https://wiki.php.net/rfc/attributes In my opinion, "PHP Attributes" might be a smart tool for PHP extension, but it's not going to be the end of the world, if we decided to live with doc-comments only.
one question, Rasmus Schultz post goes into the similar direction.
Any reason why the annotations are only a numeric list and not key
value pairs? Key-Value would be much more powerful and address a ton
of objections for us (Doctrine).
Attributes their selves are key-values, only nested values are numeric,
but instead of simple values it's possible to use expression AST, that
is more powerful than key-values.
In the current state it is pretty limited for more complex use-cases.
I don't want to fully embrace the complexities that Larry showed for
Drupal (in my opinion, too much annotations), but without key value
pairs we could only use this when we nested JSON into the attribute
value strings for example, not something I want to mix.
The Drupal example implementation on top of attributes is included in RFC.
Thanks. Dmitry.
Hi internals,
I've started voting on "PHP Attributes" RFC.
https://wiki.php.net/rfc/attributes
In my opinion, "PHP Attributes" might be a smart tool for PHP extension,
but it's not going to be the end of the world, if we decided to live with
doc-comments only.one question, Rasmus Schultz post goes into the similar direction.
Any reason why the annotations are only a numeric list and not key value
pairs? Key-Value would be much more powerful and address a ton of
objections for us (Doctrine).In the current state it is pretty limited for more complex use-cases. I
don't want to fully embrace the complexities that Larry showed for Drupal
(in my opinion, too much annotations), but without key value pairs we could
only use this when we nested JSON into the attribute value strings for
example, not something I want to mix.
I fully agree that Drupal's annotation use goes over-board at present.
:-) I used it as a real-world stress-case. However, even if we were to
scale back in Drupal the current Attributes proposal is too low-level to
be useful.
I do not have voting karma, but I would endorse voting NO on this RFC as is.
--Larry Garfield
Hi internals,
I've started voting on "PHP Attributes" RFC.
https://wiki.php.net/rfc/attributes
In my opinion, "PHP Attributes" might be a smart tool for PHP extension,
but it's not going to be the end of the world, if we decided to live with
doc-comments only.Thanks. Dmitry.
I voted -1
Reasons: from a Doctrine Annotations maintainer perspective, either getting
a list (without keys) of strings back or ast\nodes are not enough or way
too advanced for our use-case. The middle ground is missing where a
<php-constant> (Name borrowed from the RFC) can be an arbitrarily deep
nested array, that means getAttributes() does should not only return
"string" or ast\node as result for each attribute, to there should be a way
to get arrays back.
Example:
https://gist.github.com/beberlei/18db9f7d5f6157b817348a58fa2aee25
greetings
Benjamin
Hi internals,
I've started voting on "PHP Attributes" RFC.
https://wiki.php.net/rfc/attributes
In my opinion, "PHP Attributes" might be a smart tool for PHP extension,
but it's not going to be the end of the world, if we decided to live with
doc-comments only.Thanks. Dmitry.
I voted -1
Reasons: from a Doctrine Annotations maintainer perspective, either getting
a list (without keys) of strings back or ast\nodes are not enough or way
too advanced for our use-case. The middle ground is missing where a
<php-constant> (Name borrowed from the RFC) can be an arbitrarily deep
nested array, that means getAttributes() does should not only return
"string" or ast\node as result for each attribute, to there should be a way
to get arrays back.Example:
https://gist.github.com/beberlei/18db9f7d5f6157b817348a58fa2aee25
greetings
Benjamin
Urgh, that is indeed quirky, and makes it unusable.
Is that an implementation or a spec issue? I know PHP 5.6+ allows array
constants, but I am not aware of whether that is in the specification.
Indeed, show-stopper here. I'll have to vote "-1" for now, and wait for a
version that either explicitly contains any constant expression or just
supports arrays as constants.
I'll also need to compile the branch and try it out myself before voting
further: my bad for being hasty.
Marco Pivetta
My problem with this PSR is you've created something that strongly
resembles function or constructor calls, but in reality is just
key/value pairs.
That's confusing in itself, but also puts an unnecessary burden on
consumers who have to figure out how to map this apparently
"something" to "something real" - since it really isn't anything other
than pretty syntax for arrays associated with source-code elements.
Did anybody look at my notes here?
https://gist.github.com/mindplay-dk/ebd5e4f7da51da3c4e56232adef41b46
I think this is much simpler and far more flexible - it lets you do
what you're proposing with attributes (by annotating with simple
arrays) and also lets you create annotation classes.
Would anyone care to comment?
Hi internals,
I've started voting on "PHP Attributes" RFC.
https://wiki.php.net/rfc/attributes
In my opinion, "PHP Attributes" might be a smart tool for PHP extension,
but it's not going to be the end of the world, if we decided to live with
doc-comments only.Thanks. Dmitry.
I voted -1
Reasons: from a Doctrine Annotations maintainer perspective, either getting
a list (without keys) of strings back or ast\nodes are not enough or way
too advanced for our use-case. The middle ground is missing where a
<php-constant> (Name borrowed from the RFC) can be an arbitrarily deep
nested array, that means getAttributes() does should not only return
"string" or ast\node as result for each attribute, to there should be a way
to get arrays back.Example:
https://gist.github.com/beberlei/18db9f7d5f6157b817348a58fa2aee25
greetings
BenjaminUrgh, that is indeed quirky, and makes it unusable.
Is that an implementation or a spec issue? I know PHP 5.6+ allows array
constants, but I am not aware of whether that is in the specification.Indeed, show-stopper here. I'll have to vote "-1" for now, and wait for a
version that either explicitly contains any constant expression or just
supports arrays as constants.I'll also need to compile the branch and try it out myself before voting
further: my bad for being hasty.Marco Pivetta
My problem with this PSR is you've created something that strongly
resembles function or constructor calls, but in reality is just
key/value pairs.
Its actually function calls, not constructors calls :-)
That's confusing in itself, but also puts an unnecessary burden on
consumers who have to figure out how to map this apparently
"something" to "something real" - since it really isn't anything other
than pretty syntax for arrays associated with source-code elements.Did anybody look at my notes here?
https://gist.github.com/mindplay-dk/ebd5e4f7da51da3c4e56232adef41b46
I think this is much simpler and far more flexible - it lets you do
what you're proposing with attributes (by annotating with simple
arrays) and also lets you create annotation classes.Would anyone care to comment?
What happens if you say <<$x>> and then call $reflection->getAttributes()
in your eample? what is $x?
That is the problem with immediately evaluating everything non "constant".
There is no context.
Hi internals,
I've started voting on "PHP Attributes" RFC.
https://wiki.php.net/rfc/attributes
In my opinion, "PHP Attributes" might be a smart tool for PHP
extension,
but it's not going to be the end of the world, if we decided to live
with
doc-comments only.Thanks. Dmitry.
I voted -1
Reasons: from a Doctrine Annotations maintainer perspective, either
getting
a list (without keys) of strings back or ast\nodes are not enough or way
too advanced for our use-case. The middle ground is missing where a
<php-constant> (Name borrowed from the RFC) can be an arbitrarily deep
nested array, that means getAttributes() does should not only return
"string" or ast\node as result for each attribute, to there should be a
way
to get arrays back.Example:
https://gist.github.com/beberlei/18db9f7d5f6157b817348a58fa2aee25
greetings
BenjaminUrgh, that is indeed quirky, and makes it unusable.
Is that an implementation or a spec issue? I know PHP 5.6+ allows array
constants, but I am not aware of whether that is in the specification.Indeed, show-stopper here. I'll have to vote "-1" for now, and wait for a
version that either explicitly contains any constant expression or just
supports arrays as constants.I'll also need to compile the branch and try it out myself before voting
further: my bad for being hasty.Marco Pivetta
What happens if you say <<$x>> and then call $reflection->getAttributes() in your eample? what is $x?
That is the problem with immediately evaluating everything non "constant". There is no context.
There's is no context. Annotations should be context-free - that's by design.
There's also no $this, and no self:: or static:: either, because the
annotations are supposed to be context-free. They're meta-data, not
functions - you already have functions, interfaces, abstract methods
etc. for that.
Suppose you don't have an instance of a class yet, and you reflect and
try to get the value of something that requires context - it doesn't
exist yet. Then what? Obtaining the meta-data before you have an
instance is a common use-case, for example when generating schema from
table/column meta-data attached to entities, you don't have an
instance yet - you're inspecting the class, methods and properties,
not an object.
If you insist on putting something in annotations that requires
context, what you should put in there, is an anonymous function - e.g.
a function that expects the consumer to provide the context, such that
you're not dependent on some implied context, instead you're asking
for a specific context. Dependency injection - good stuff. There's an
example of that in my comment below the gist.
Though personally I would never, ever put functionality in an
annotation - it's a huge misunderstanding, in my opinion. If what you
wanted was executable functionality that requires a context, what you
really want is an interface that you can implement. Context requires a
contract.
Just my opinion, of course, and there's nothing stopping you from
using functions if that's your fancy. And it's much safer and
friendlier to readers, and static analysis tools, not to expect a
run-time context to always be established by the consumer.
Either way, the majority use-case is attaching meta-data to
classes/properties/methods - wanting to attach code and evaluate it at
run-time is a marginal use-case. Designing the whole thing for that
first, and sacrificing all the flexibility of the language itself by
inventing an entirely new concept, which is entirely dependent on
run-time interpretation, in my opinion, is just completely backwards,
when you can do something much, much simpler with far more freedom and
options and design-time safety.
My problem with this PSR is you've created something that strongly
resembles function or constructor calls, but in reality is just
key/value pairs.Its actually function calls, not constructors calls :-)
That's confusing in itself, but also puts an unnecessary burden on
consumers who have to figure out how to map this apparently
"something" to "something real" - since it really isn't anything other
than pretty syntax for arrays associated with source-code elements.Did anybody look at my notes here?
https://gist.github.com/mindplay-dk/ebd5e4f7da51da3c4e56232adef41b46
I think this is much simpler and far more flexible - it lets you do
what you're proposing with attributes (by annotating with simple
arrays) and also lets you create annotation classes.Would anyone care to comment?
What happens if you say <<$x>> and then call $reflection->getAttributes() in
your eample? what is $x?That is the problem with immediately evaluating everything non "constant".
There is no context.Hi internals,
I've started voting on "PHP Attributes" RFC.
https://wiki.php.net/rfc/attributes
In my opinion, "PHP Attributes" might be a smart tool for PHP
extension,
but it's not going to be the end of the world, if we decided to live
with
doc-comments only.Thanks. Dmitry.
I voted -1
Reasons: from a Doctrine Annotations maintainer perspective, either
getting
a list (without keys) of strings back or ast\nodes are not enough or
way
too advanced for our use-case. The middle ground is missing where a
<php-constant> (Name borrowed from the RFC) can be an arbitrarily deep
nested array, that means getAttributes() does should not only return
"string" or ast\node as result for each attribute, to there should be a
way
to get arrays back.Example:
https://gist.github.com/beberlei/18db9f7d5f6157b817348a58fa2aee25
greetings
BenjaminUrgh, that is indeed quirky, and makes it unusable.
Is that an implementation or a spec issue? I know PHP 5.6+ allows array
constants, but I am not aware of whether that is in the specification.Indeed, show-stopper here. I'll have to vote "-1" for now, and wait for
a
version that either explicitly contains any constant expression or just
supports arrays as constants.I'll also need to compile the branch and try it out myself before voting
further: my bad for being hasty.Marco Pivetta