Re: [RFC]

From: 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

« previous php.internals (#108528) next »