I'd like to finish this RFC, but I have two remaining issues.

The syntax is a minor issue - since any valid PHP expression can be
used, the bit-shift ambiguity is technically an issue, however
marginal.

A lot of people commented on the syntax when I posted the RFC on
reddit - they don't like it.

Anyone have any ideas for an alternative syntax? It needs to be
delimited, e.g. needs to use opening and closing delimiters or a
recognizable opening delimiter... Here's some ideas:

@{ new Table("user") }

@[ new Table("user") ]

{{ new Table("user") }}

+{ new Table("user") }

I don't like any of these really, but the bit-shift operator isn't
going when the stuff inside is an expression which could include
bit-shift (is it?)

The other issue is the dependency (context) injection example - no one
seems to be able to cite an actual use-case, and if that's the case, I
should probably just remove it from the RFC entirely?

@Larry can you think of a case example in the myriad annotations
you've seen in Drupal code? :-)

Anyone else using Doctrine Annotations actually seen anyone making use
of a closure in an annotation?


On Tue, May 17, 2016 at 11:06 AM, Rasmus Schultz <ras...@mindplay.dk> wrote:
> Richard,
>
> I believe I have already stated my position on all of these concerns
> in my last email.
>
> Short recap:
>
> There's no such thing as optional dependencies - if you depend on a
> Doctrine ORM annotation, you depend on that package.
>
> The code should (must) error the moment you try to instantiate those
> annotations - whether you intend to use them or not is besides the
> question - a missing class is an error, in annotations as it is
> anywhere else in your code.
>
> Silently ignoring missing annotations solves nothing - it just leads
> to errors that are even harder to find and debug.
>
> You seem awfully concerned about name collisions? Most packages use a
> vendor\package namespace convention now - PHP has always been adding
> things to the global namespace, and it's never been a really
> substantial problem. I'm not that concerned.
>
> The one new thing you brought up here, is the issue of potentially
> loading/instantiating a bunch of annotations that go unused. From a
> dependency point of view, I maintain that that's correct and it should
> error out on missing classes.
>
> From a performance point of view, you may have a valid concern, and
> this had occurred to me before - but I decided to leave it alone, for
> a couple of reasons. The most important reason being, look at how
> annotations get used in practice: controllers get things like route
> and filter annotations, all of which are usually needed at the same
> time; entities get ORM annotations, all of which are usually needed at
> the same time; form models get validation and input-type annotations,
> all of which are usually needed at the same time. And so on.
>
> The fact of the matter is that classes tend to have a single
> responsibility, and this usually means that applicable annotations
> tend to belong to a specific domain, and are needed at the same time.
>
> In other words, this problem is pretty theoretical - in reality, it's
> a very small problem, which, if somebody was very concerned about,
> could absolutely be solved in userland, by adding a cache layer. Which
> projects like Doctrine Annotations would likely do anyway, in order to
> cache the result of mode complex annotation logic to control
> inheritance, cardinality, applicability, etc. - all the complex stuff
> that this RFC stays away from.
>
> The extreme case of what you're proposing, is what Go does - an
> annotation is simply a string. No chance of any error, anywhere, ever,
> right? Wrong. People put JSON data in those strings for example, and
> parsing that data leads to run-time errors instead. That's the extreme
> example, but the problem with what you're proposing is precisely the
> same: you allow something like nested array data structures, those are
> still going to get interpreted and mapped to objects at run-time, and
> it leads to run-time errors instead.
>
> I maintain that the majority use-case is object annotations - and that
> deferring the construction of those objects doesn't solve anything.
>
> You're just deferring or hiding the problem, adding complexity, and
> mental as well as practical debugging effort - but the problem doesn't
> go away.
>
> I am and will always be in favor of language design that takes the
> most direct route to satisfy a requirement. In this case, the
> requirement is annotations as objects - and the most natural and
> direct route is the "new" keyword, static method calls, or whatever
> way you normally create objects; inventing a more indirect way to do
> that just adds complexity.
>
>
> On Mon, May 16, 2016 at 8:39 PM, Fleshgrinder <p...@fleshgrinder.com> wrote:
>> On 5/16/2016 3:05 PM, Rasmus Schultz wrote:
>>> I'm sorry, but I think that the idea of meta-data that can't error
>>> somehow, somewhere, at some point, is completely unrealistic.
>>>
>>> And I'd much rather have a simple facility that enables those errors
>>> to surface quickly.
>>>
>>
>> It should error and it should error exactly at the point when you want
>> to use it and at no other point. Right now they will error anytime
>> anyone wants to do anything with any annotation.
>>
>> I fully understand the urge to directly access objects and I actually
>> support it and I want them to error out at the point where you try to
>> instantiate them. However, not when I simply access annotations in
>> introspection.
>>
>> According to your logic I have to load the whole dependency chain, even
>> thought I just want to generate my documentation that might have some
>> annotations in use. I also need to load all my dependencies even though
>> I wanted to leave the security dependency out because I wanted to easily
>> disable the security annotation system locally for development. I even
>> have to load the whole dependency chain, even though I just want to
>> introspect the single data structure at hand without invoking anything.
>>
>> Even worse if I am using a package that has Doctrine annotations but I
>> use it without them: /fatal error/
>>
>> Nice? No!
>>
>> Solutions?
>>
>> Make the /simple/ annotations /simple/. ;-)
>>
>> Only allow scalar data to be defined and allow userland to register
>> themselves for specific annotations. I mentioned this before but somehow
>> everyone wants something more fancy and I have no karma (even though
>> requested but ignored) to write my own RFC. That being said, you have
>> the ability to write an RFC so please just take it. :-)
>>
>> Some PHP code to illustrate what I was thinking of since I am better
>> with code than with words. :-P
>>
>> https://gist.github.com/Fleshgrinder/d26cd4751827b8c10a0dc33da32b48c3
>>
>> Reflection is the wrong tool for the job to build annotation systems.
>> Reflection should not be used in production it should be used to
>> introspect data structures and reason about them or other stuff during
>> unit tests.
>>
>> However, reflection should provide the ability to read annotations, it
>> just does not do anything with them by default and outputs stupid
>> arrays. You will definitely understand what I mean it you follow the Gist.
>>
>> I am sure there is room for improvement and that I overlooked something
>> in my Gist. But I think it is a starting point, some additional notes:
>>
>> - I do not see any benefit in annotations for parameters.
>> - I do not see any benefit in annotations for Generators.
>> - I do not see any benefit for annotations in php-src.
>>
>> My proposal would include to ban annotations from php-src and make it a
>> pure userland functionality. This has many advantages:
>>
>> - No name collisions.
>> - Clear policy for the future.
>> - php-src features are never optional.
>> - php-src does not provide meta-data.
>>
>> Let me know what you think or if you have questions in regards to the
>> Gist that are unclear. (Or maybe you found mistakes.)
>>
>> --
>> Richard "Fleshgrinder" Fussenegger
>>

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to