Thanks Driven Life

日々是感謝

merciful-polluter 0.0.4 をリリースしました

実に5年ぶり & 令和初となるバージョンアップです。

概要

$_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 (相当の処理)を行う」がオリジナルの挙動でした。

まとめ

令和です。