Re: [RFC] [Vote] Deprecate functions with overloaded signatures

From: 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

« previous php.internals (#120718) next »