On Wed, Mar 15, 2017 at 11:49 AM, Benoît Burnichon <[email protected]>
wrote:
> Hi all,
>
> Looking at code of PHPUnit, I stumbled upon an inconsistent array
> conversion:
>
> ------
> /**
> * @param ArrayAccess|array $other
> */
> function evaluate($other)
> {
> // type cast $other as an array to allow
> //support in standard array functions.
> if ($other instanceof ArrayAccess) {
> $data = (array) $data;
> }
>
> $patched = array_replace_recursive($other, $this->subset);
>
> // ...
> }
> -----
>
> This would work only for `ArrayAccess` implementations extending
> `ArrayObject` as shown by https://3v4l.org/ti4aY
>
> Looking at the manual
> http://php.net/manual/en/language.types.array.php#
> language.types.array.casting
> ,
> it seems `ArrayObject` class does not comply to array casting because
> integer public properties could also be retrieved. Some tests showed that
> regular class always have string keys even when a `$key = 0; $this->{$key}
> = 'avalue';` is called. In this case, `var_export((array)$object);` returns
> `array('0' => 'avalue')` (Notice the quote around key 0 -
> https://3v4l.org/6QW70)
>
> What do you think of adding an optional `__toArray()` method to classes
> which would default to current behavior but would allow specifying
> behavior. The way of internal `__toString()` method and could explain
> inconsistency of the `ArrayObject` class?
>
I like the idea kind of, but would this remove the ability to cast to array
all classes not implementing __toArray, as is the case with __toString?
This would be a HUGE BC if so:
$ php -r 'class Foo {public $foo = "foobar";} var_dump((array) (new Foo));'
array(1) {
["foo"]=>
string(6) "foobar"
}
$ php -r 'class Foo {public $foo = "foobar";} var_dump((string) (new Foo));'
PHP Recoverable fatal error: Object of class Foo could not be converted to
string in Command line code on line 1
$ php -v
PHP 7.1.2 (cli) (built: Feb 27 2017 00:02:44) ( ZTS )
> Regards,
>
> Benoît Burnichon
>