Re: [RFC] [Vote] Deprecate functions with overloaded signatures
| From: | Theodore Brown | Date: | Thu, 29 Jun 2023 16:51:21 +0000 |
| Subject: | Re: [RFC] [Vote] Deprecate functions with overloaded signatures | ||
| References: | 1 2 3 4 5 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-120718@lists.php.net to get a copy of this message | ||
On Tue, June 27, 2023, 6:33 Rowan Tommins wrote:
> On 27/06/2023 02:25, Theodore Brown wrote:
> > Currently the following code returns only the array keys that loosely equal null:
> >
> > array_keys($array, null)
> >
> > If the function is changed to a single signature with $filter_value defaulting to null
> > (with an argument count check to preserve the above functionality), its behavior becomes a lot more
> > surprising/unexpected. If a parameter defaults to null, as a user I don't expect the function
> > to work differently when I explicitly pass the default value.
>
>
> An alternative solution to this situation is to introduce a new dummy
> value for such parameters, similar to how JavaScript uses the special
> "Symbol" type to have keys that can't collide with any userland value.
> In this context, this could be achieved with a single-value enum, i.e.:
>
> enum ArrayKeys { case IncludeAll; }
>
> function array_keys(array $array, mixed $filter_value =
> ArrayKeys::IncludeAll, bool $strict = false): array {}
>
> That way, the optional parameter has a real default value, distinct from
> any value the user might wish to filter by, including null, and full
> compatibility is maintained with existing code.
>
> I don't know whether this is a direction we want to go, but thought I'd
> throw it out there.
That's an interesting idea, but I'm not sure it would make the behavior any less
confusing. Are single-value enums used like this anywhere else in PHP? As a user my expectation when
seeing
ArrayKeys::IncludeAll as the default is that there must be other
ArrayKeys enum values for additional options.
Note that currently there is a draft RFC to support objects in array keys. [1] If that feature is
accepted, would it not be allowed to filter array keys by the ArrayKeys::IncludeAll
enum value? That would also be surprising/unexpected.
Based on the current vote tally, array_keys looks like it will be the only remaining
function in PHP 9 with an overloaded signature, which would make it all the more strange.
[1]: https://wiki.php.net/rfc/object_keys_in_arrays