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

Reply via email to