> On Nov 17, 2019, at 9:41 AM, Aimeos | Norbert Sendetzky <[email protected]>
> wrote:
>
> Since PHP 7.1 there's the "iterable" pseudo type hint that matches
> "array" and "Traversable".
>
> PHP frameworks would profit from support of an "arrayable" pseudo type
> hint that matches "array" and all objects that implements "Traversable",
> "ArrayAccess" and "Countable".
If we are going to open up arrays for enhancement in PHP 8 I would ask that we
seriously consider addressing the various differences between a built-in array
and an instance of ArrayObject and/or the related associated interfaces such
that the objects can be used interchangeably with a built-in array, i.e. that
ArrayObject and the related associated interfaces can fully replace the use of
arrays when refactoring.
Specifically I would propose that we provide some type of mechanism that would
allow the developer to cause is_array() to return true on an
ArrayObject/interfaces. Maybe something like this (I have not considered all
the special cases, I am just spitballing in concept here):
class MyArray extends ArrayObject {
function __AsArray() {
return true;
}
function hello() {
echo 'Hi!';
}
}
echo is_array(new MyArray()) // outputs: true
? 'true'
: 'false';
Also, when the object is used by any of the internal PHP functions that expect
an array, such as sort() the internal function would treat the object as an
array inside the function. This also means returning the object from methods
like array_filter() when an ArrayObject with __AsArray()===true is passed.
Even though these objects would be treated as arrays when in an array context
they should still be able to call their own methods, e.g.
$array = new MyArray()
$array->hello() // outputs: Hi!
? 'true'
: 'false';
This would go a long way to allowing PHP developers to incrementally clean up
the gobs of legacy code in the wild, and move to objects where appropriate.
-Mike