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