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 -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php