Re: Deprecated partially supported callables: should is_callable() throwa deprecation notice ?
| From: | Christoph M. Becker | Date: | Fri, 18 Mar 2022 13:37:36 +0000 |
| Subject: | Re: Deprecated partially supported callables: should is_callable() throwa deprecation notice ? | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-117371@lists.php.net to get a copy of this message | ||
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_callablesx;wp§�Ǽç9
> LÉ
>
> 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