> Le 18 mars 2022 à 18:03, Juliette Reinders Folmer > <php-internals_nos...@adviesenzo.nl> a écrit : > > On 18-3-2022 14:37, Christoph M. Becker wrote: >> On 16.03.2022 at 06:52, Juliette Reinders Folmer wrote: >>> I've just been looking in detail at the Partially Supported Callables >>> deprecation RFC: >>> https://wiki.php.net/rfc/deprecate_partially_supported_callables >>> The RFC explicitly excludes the `is_callable()` function and the >>> `callable` type from throwing deprecation notices. >>>> The |is_callable()| function and |callable| type remain side-effect >>>> free and do not throw a deprecation warning. They will continue to >>>> accept these callables until support is removed entirely. >>> While I can fully support this for the `callable` type, I wonder if the >>> decision to not throw a deprecation on use in `is_callable()` is the >>> right one (though I understand the desire to keep it side-effect free). >>> Consider these code samples: >>> function foo(callable $callback) {} >>> foo('static::method'); >>> This function call not throwing a deprecation is not problematic as in >>> PHP 9.0 the function will start throwing a TypeError. >>> if (is_callable('static::method')) { >>> static::method(); >>> } >>> The second code sample, however, is problematic, as in PHP 9.0, the >>> behaviour of this code will be silently reversed for those callbacks >>> which would previously result in `is_callable()` returning true, which >>> makes this a potentially dangerous change without deprecation notice. >>> Would anyone care to enlighten me as to whether this was given due >>> consideration ? >> Frankly, I don't know. Apparently, there was almost no discussion about >> that RFC. Part of the reasoning to not raise E_DEPRECATED when calling >> is_callable() was likely the typical use case >> $callable = …; >> if (is_callable($callable)) { >> call_user_func($callable); >> } >> what would report the deprecation when actually calling the callable. >> Not sure what to do regarding your given use case(s). >> -- >> Christoph M. Becker > > Unfortunately, those aren't the only places I see this happening and my > example is not a stand-alone case either. > > I came across the above code sample ( is_callable('static::method') / > is_callable(['parent', __FUNCTION__]) with variable method calls) in a number > of different packages when testing a (PHPCompatibility) sniff I am writing to > detect the deprecation, so this code pattern looks to be relatively common. > > Some examples: > * > https://github.com/symfony/service-contracts/blob/bc0a2247c72d29241b5a06fb60dc1c9d9acf2a3a/ServiceSubscriberTrait.php#L39 > * > https://github.com/mockery/mockery/blob/c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac/library/Mockery/Mock.php#L960 > * > https://github.com/simplepie/simplepie/blob/dacf0ed495d2e8fb306e526ca3f2a846af78a7c9/tests/oldtests/absolutize/RFC3986.5.4/base.php#L13 >
As I think that it is a serious oversight of the RFC, I have open: https://github.com/php/php-src/issues/8401 <https://github.com/php/php-src/issues/8401> —Claude