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