Greetings,
There is something weird with 7.1 and implicit strings to array
conversions, so I wanted to double check with you that the behaviour is
wanted (and perhaps the migration71 doc should be updated to reflect this.
So in the migration docs [1] you say that: " Applying the empty index
operator to a string (e.g. $str[] = $x) throws a fatal error instead of
converting silently to array. "
I'm going to show four cases on different PHP versions:
CASE 1: php -r '$a = "foo"; $a[] = "bar"; var_dump($a);'
PHP 5.6.x -> Fatal Error
PHP 7.0.x -> Fatal Error
PHP 7.1.x -> Fatal Error
CASE 2: php -r '$a = "foo"; $a["x"] = "baz"; var_dump($a);'
PHP 5.6.x -> string "boo" (with illegal offset warning)
PHP 7.0.x -> string "boo" (with illegal offset warning)
PHP 7.1.x -> string "boo" (with illegal offset warning)
CASE 3: php -r '$a = ""; $a["x"] = "bar"; var_dump($a);'
PHP 5.6.x -> array("x" => "bar") with NO warnings
PHP 7.0.x -> array("x" => "bar") with NO warnings
PHP 7.1.x -> string "b" with illegal offset warning
CASE 4: php -r '$a = ""; $a[] = "bar"; var_dump($a);'
PHP 5.6.x -> array("bar") with NO warnings
PHP 7.0.x -> array("bar") with NO warnings
PHP 7.1.x -> Fatal Error
I think what is bugging me here is that the docs talk about CASE 1 whose
behaviour actually did not change, so it should mention "empty string"
because that's where the actual change happened (CASE 4), also I think that
CASE 3 should be rethinked.
In general I would like to raise a concern on the fact that I think the
previous behaviour was better, after all PHP is dynamically typed so why
not allow a variable to silently change its value silently? We know that
using offset with strings is always illegal (CASE 2) so why not always
converting it to an array and discard its previous value?
Greetings,
There is something weird with 7.1 and implicit strings to array
conversions, so I wanted to double check with you that the behaviour is
wanted (and perhaps the migration71 doc should be updated to reflect this.So in the migration docs [1] you say that: " Applying the empty index
operator to a string (e.g. $str[] = $x) throws a fatal error instead of
converting silently to array. "I'm going to show four cases on different PHP versions:
CASE 1: php -r '$a = "foo"; $a[] = "bar"; var_dump($a);'
PHP 5.6.x -> Fatal Error
PHP 7.0.x -> Fatal Error
PHP 7.1.x -> Fatal ErrorCASE 2: php -r '$a = "foo"; $a["x"] = "baz"; var_dump($a);'
PHP 5.6.x -> string "boo" (with illegal offset warning)
PHP 7.0.x -> string "boo" (with illegal offset warning)
PHP 7.1.x -> string "boo" (with illegal offset warning)CASE 3: php -r '$a = ""; $a["x"] = "bar"; var_dump($a);'
PHP 5.6.x -> array("x" => "bar") with NO warnings
PHP 7.0.x -> array("x" => "bar") with NO warnings
PHP 7.1.x -> string "b" with illegal offset warningCASE 4: php -r '$a = ""; $a[] = "bar"; var_dump($a);'
PHP 5.6.x -> array("bar") with NO warnings
PHP 7.0.x -> array("bar") with NO warnings
PHP 7.1.x -> Fatal ErrorI think what is bugging me here is that the docs talk about CASE 1 whose
behaviour actually did not change, so it should mention "empty string"
because that's where the actual change happened (CASE 4), also I think that
CASE 3 should be rethinked.In general I would like to raise a concern on the fact that I think the
previous behaviour was better, after all PHP is dynamically typed so why
not allow a variable to silently change its value silently? We know that
using offset with strings is always illegal (CASE 2) so why not always
converting it to an array and discard its previous value?
See https://bugs.php.net/bug.php?id=73925.
--
Christoph M. Becker