Re: [RFC]
| From: | Mike Schinkel | Date: | Wed, 12 Feb 2020 03:58:48 +0000 |
| Subject: | Re: [RFC] | ||
| References: | 1 2 3 4 5 6 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-108503@lists.php.net to get a copy of this message | ||
> On Feb 11, 2020, at 9:51 AM, Chase Peeler <chasepeeler@gmail.com> wrote:
>
> Can anyone thing of a use-case where you would want a string name of a
> function and a callable would not be acceptable, besides possibly debugging
> code that said 'echo "I'm calling ".myfunction::function;'? Everything
> that
> I can think of that accepts a function name, also accepts a callable (e.g.
> array_map), but I could be forgetting something.
>
> If not, then I think it makes sense to return a callable. It might not be
> entirely consistent with the behavior of ::class, but, a class isn't
> entirely consistent with a method/function either, so I think there is some
> latitude for small differences.
>
> As for the ::func vs ::function. I think ::function is safer, since it's a
> reserved word. Otherwise you might run into issues with something like this:
>
> class foo {
> const func = "bar";
> }
>
> function foo(){}
>
> echo foo::func;
>
> Probably not something that happens very often, but, I think the 4 extra
> characters to prevent it would be worth it.-------
Returning a _closure_ instead of a string would be providing a feature we _already_ have instead of
one we do _not_ have.
If we had ::function returning a string we could use Closure::fromCallable() to get a closure. Or
today just use fn() => myfunc().
But if ::function instead returned a closure then there still would be no way to extract the name of
a function as a string from a symbol where PHP can throw a warning if it does not recognize the
symbol, such as in the case of a typo.
Seems to me having a shorter syntax to get a closure is an orthogonal concern.
If we want a shorthand for closure we should create an additional syntax for it but still provide a
way to extract a function's name as a string from its symbol since that is currently _not_
possible. Getting a closure from a function symbol currently _is_ possible.
Much better to provide ::function to return the name of the function and ::closure get a closure
that can call the function.
Or have ::function to return the name of the function and provide a syntax something like ${myfunc}
to return a closure, which has been suggested later in this thread.
Or best would be to add ::nameof for functions, method, classes, interfaces and traits and provide
access to closures using either ::closure or a new short syntax.
-Mike
P.S. A language I specialized in during the late 80's and early 90's called Clipper
implemented closures with the following syntax:
- Without parameters: {|| expr } equivalent to function(){ return expr; } and fn() => expr;
- With parameters: {|a,b| expr } equivalent to function(a,b){ return expr; } and fn(a,b) =>
expr;
If we want a shorter syntax for function closures than fn() => myfunc() maybe we consider {||
myfunc() } which would be more general purpose than only returning a closure for a function?