Re: [RFC]
| From: | Mike Schinkel | Date: | Thu, 13 Feb 2020 03:33:32 +0000 |
| Subject: | Re: [RFC] | ||
| References: | 1 2 3 4 5 6 7 8 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-108528@lists.php.net to get a copy of this message | ||
> On Feb 12, 2020, at 5:47 PM, Rowan Tommins <rowan.collins@gmail.com> wrote:
>
> On 12/02/2020 03:58, Mike Schinkel wrote:
>> Returning a_closure_ instead of a string would be providing a feature we_already_ have
>> instead of one we do_not_ have.
>
>
> Not really, because you still need a way to get the fully-qualified name of the function. This
> is not valid:
>
> namespace MyVendor\Something\Foo;
> function bar() {}
>
> \Closure::fromCallable('bar'); # Error: tries to resolve function '\bar'
>
Why would ::function return a short name instead of the fully-qualified name?
::function should return the fully-qualified name as does ::class. Then the concern you state
becomes a non-issue.
If ::function returns a fully qualified name developers can always use string functions to get the
short name if they need it.
> So if we had ::function which returned the name, and ::callable that returned a closure, the
> following would be equivalent:
>
> namespace MyVendor\Something\Foo;
> function bar() {}
>
> \Closure::fromCallable('MyVendor\Something\Foo\bar');
> \Closure::fromCallable(bar::function);
> bar::callable;
>
> One combination would be ::function returning a string, and $() accepting one, which would
> give:
>
> $(bar::function)
>
> In practice, that would almost certainly be optimised into one instruction, so the main
> advantage would be consistency, unless there are use cases where a string rather than "any
> callable" is actually required.
Yes.
>> Or today just use fn() => myfunc().
>
>
> That's not quite the same either: at the very least, you need to define it as fn(...$args)
> => myfunc(...$args) to pass through the parameters.
Assuming there are parameters.
> But Closure::callable is able to copy the signature of the original function, including type
> information [1], so our hypothetical ::callable could do the same.
True.
-------
As an aside, I wish we had a new simpler form of metadata object that could provide the features of
reflection quicker and easier and one that didn't need to be wrapped in a try{}catch{}.
Something like this:
- https://gist.github.com/mikeschinkel/78684d708358e1d101e319c7a2fdef9c
But this being PHP — with its love of verbosity and complexity when adding classes, and disdain
for adding something if a capability already exists, no matter how cumbersome it is — chances of
this becoming a thing is pretty much moot. So I am just pontificating.
-Mike