wiki.php.net
Resume pret
HTTP 200
Ce RFC propose deux optimisations pour les closures (y compris les arrow functions) : inférer le modificateur static quand elles n'utilisent pas $this, et mettre en cache les closures sans état entre utilisations.
L'inférence de static s'applique seulement si la closure n'utilise pas $this, ni $$var, ni des appels dynamiques (par exemple $f(), call_user_func(), ou Foo::bar() qui pourrait être un appel d'instance), ne déclare pas de closure non statique imbriquée, et n'utilise pas require/include/eval.
Les closures sans état (static, sans captures et sans variables static internes) sont instanciées une seule fois et réutilisées, réduisant le nombre d'objets et les cycles de références, avec des gains mesurés (p. ex. ~78 % des closures statiques inférées dans Symfony Demo et ~3 % d'amélioration sur un benchmark Laravel).
Parmi les ruptures de compatibilité, ReflectionFunction::getClosureThis() pourra désormais retourner NULL pour des closures inférées comme static, deux closures créées au même emplacement lexical deviendront identiques (test() === test() retourne true), et des objets auparavant protégés par des cycles peuvent être collectés plus tôt, déclenchant leurs destructeurs plus tôt.
Closure::bind()/bindTo() acceptent désormais explicitement un objet sur des closures inférées comme static (l'objet est alors ignoré pour limiter les régressions), et le RFC a été accepté et landed pour la version proposée PHP 8.6.