Re: [RFC]

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

« previous php.internals (#108503) next »