Le ven. 22 oct. 2021 à 15:41, Dylan K. Taylor <dkta...@pmmp.io> a écrit :

>
> ---- On Fri, 22 Oct 2021 14:19:23 +0100 Claude Pache <
> claude.pa...@gmail.com> wrote ----
>
>  >
>  > Le 21 oct. 2021 à 01:12, Dylan K. Taylor <dkta...@pmmp.io> a écrit :
>  >
>  > Hi all,
>  >
>  > Given the addition of Closure::fromCallable() and the upcoming
> first-class callable syntax in 8.1, it seems slightly problematic that
> there's no simple way to tell by reflection if a Closure refers to an
> anonymous function or not. ReflectionFunctionAbstract::isClosure() (perhaps
> somewhat misleadingly) returns whether the closure is literally a \Closure
> instance, so it's not useful for this purpose.
>  >
>  > The only way to do this currently (that I know about) is to check if
> the name of the function contains "{closure}", which is a bit unpleasant
> and depends on undocumented behaviour.
>  >
>  > I'm proposing the addition of
> ReflectionFunctionAbstract::isAnonymous(), which would fill this use case,
> and may be able to offer an implementation.
>  >
>  > Thanks,
>  > Dylan Taylor.
>  >
>  >
>  > --
>  > PHP Internals - PHP Runtime Development Mailing List
>  > To unsubscribe, visit: https://www.php.net/unsub.php
>  >
>  >
>  >
>  > Hi,
>  >
>  > Per the manual [1], Closure::fromCallable() “creates and returns a new
> anonymous function”. I guess that this might not match your notion of
> “anonymous function”?
>  >
>  > Therefore, I am asking for clarification: What practical distinction do
> you make between ”an instance of Closure” and “an anonymous function”, and
> why does this distinction matter?
>  >
>  > [1]: https://www.php.net/manual/en/closure.fromcallable.php
>  >
>  > —Claude
>  >
>
> Hi Claude,
> Sorry for the double email, my previous reply got bounced from the mailing
> list because I replied from the wrong address.
>
> An anonymous function would be an unnamed function, e.g. arrow function or
> function(){}.
>
> I guess the documentation for Closure::fromCallable() ought to be updated,
> because Closure::fromCallable('namedFunc') isn't really anonymous, it's a
> \Closure object that refers to a named function. A \Closure may refer to a
> named or an anonymous function, and currently there's no way to tell the
> difference without hacks.
>
> The distinction is important for reflection cases, such as the one Aaron
> mentioned, and also like generating a pretty name for closures in a project
> I maintain [1].
>
> It's a fringe use case for sure, but considering we already have
> ReflectionClass->isAnonymous(), I think it makes sense.
>
> [1]:
> https://github.com/pmmp/PocketMine-MP/blob/986b4e0651d665c72ec011542f95b4bd9529c6a8/src/pocketmine/utils/Utils.php#L144
>
>
>

For the record, I submitted a PR adding ReflectionFunction::isAnonymous()
at
https://github.com/php/php-src/pull/8499

Cheers,
Nicolas

Reply via email to