Hi Ben,
> I think there are some places where `is_list()` could be unintuitive to
> those who don’t understand some of the idiosyncrasies of PHP.
>
> For example, with
>
> $a = ['foo', 'bar', 'baz’];
>
> `is_list()` will return `true`, but if you run `$a` through `asort()`,
> `is_list()` will return `false` because the keys are no longer
> consecutive integers, but is there any doubt this is still a list?
> Maybe in a pure sense, it’s not, but I think this could be confusing.
>
> But now, if we do
>
> $b = array_merge($a, ['qux', 'quux']);
>
> `$b` is now back to being a list, so `is_list($b)` returns `true`.
Yes, that's correct.
These idiosyncrasies of php and unintuitive behaviors existed
prior to this RFC.
It's also confusing when `reset($x)` is not the same thing as `$x[0]`
on a non-empty array with keys 0..n-1 out of order if you're still learning php.
> While I understand the convenience `is_list()` provides--I myself have
> implemented the opposite of this numerous times (e.g.,
> `is_dict()`)--it comes close to implying a data type that PHP doesn’t
> have, and I think this could give a false sense of type-safety-ness
> when using this function to check whether something is a 0-indexed
> array.
It would simplify `is_dict(array $x)` to `count($arr) > 0 && !is_list($arr)`,
and potentially improve performance.
There's already some ways `is_*` doesn't correspond to a data type
- `is_numeric` does not correspond to a data type.
- `is_callable` varies depending on the context where it's called for private
methods.
- `is_resource` returns false if a resource is closed.
- `is_file` is checking for a path (and readability?) on disk, not a type.
If you do understand what the type checks are doing, it makes it easier to
check type-safety-ness
in a script (e.g. `if(!is_list(...)){ /*warn*/ }` in a standalone script) or
with external analyzers.
Thanks,
Tyson
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php