実に5年ぶり & 令和初となるバージョンアップです。
- https://github.com/gongo/merciful-polluter/releases/tag/0.0.4
- https://packagist.org/packages/gongo/merciful-polluter
- [2019/09/08 23:30 現在] packagist に 0.0.4 タグが反映されていない
- [2019/09/09 23:30 現在] packagist に 0.0.4 反映されました
概要
$_GET
や $_POST
で同じキーにそれぞれ違う配列がセットされている時に、オリジナルとは違った結果になる不具合を修正しました。
解説
例えば下記のようなサーバーサイドのコードがあるとします。
<?php if (version_compare(PHP_VERSION, '5.4.0', '>')) { require_once './vendor/autoload.php'; $request = new Gongo\MercifulPolluter\Request; $request->pollute(); } var_dump($foo); // php.ini は下記を想定 // // register_globals = 'On' // variables_order = 'GP'
上記コードを、例えば PHP 5.3 で動かしてみると:
$ curl 'http://localhost?foo\[bar\]\[a\]=123' -X POST -d "foo[bar][b]=789" array(1) { ["bar"]=> array(2) { ["a"]=> string(3) "123" ["b"]=> string(3) "789" } }
こうなりますが、これを PHP 7.1 with merciful-polluter 0.0.3 で動かしてみると:
$ curl 'http://localhost?foo\[bar\]\[a\]=123' -X POST -d "foo[bar][b]=789" array(1) { ["bar"]=> array(1) { ["b"]=> string(3) "789" } }
もうお分かりかと思います。
- エミュレート版 (merciful-polluter) はそのまま上書きしちゃっている
- オリジナル版は
array_merge
している
この違いがありました。それを裏付けるコードがこちら
https://github.com/php/php-src/blob/php-5.3.29/main/php_variables.c#L647-L668
正確には「上書きする値と上書き先の値がどちらも Array だった場合 array_merge_recursive
(相当の処理)を行う」がオリジナルの挙動でした。
まとめ
令和です。