今天遇到很奇怪的行為,在 PostMan 將 HTTP POST data 丟給 PHP 以後,參數名稱裡面有 . (dot) 的字元,全部都被改為 _ (underscore) 了。像是 field 名稱為「article.title」的欄位名稱,在 PHP 底下取值必須使用 $_POST[‘article_title’]。
原本以為 RFC 裡面有的定義 reserve word,但是找了半天找不到。最後原因是 PHP 為了支援 register_global,但是 PHP 變數名稱又不允許使用 . (dot) 當作名稱的一部分,最後就自動轉為 _ (underscore)。
這個行為不管有沒有啟動 register_global 都會出現,即使上了 PHP 7.2 都已經不支援了,這個行為仍然存在。
ref:
後來做了個簡單的測試,在 HTTP POST 依序送出二個 field data:
a.b=100&a_b=200
這時候再印出 $_POST:
var_dump($_POST);
array(1) {
'a_b' =>
string(3) "200"
}
所以後面的會打贏前面的 … (所以「世界上的戰爭沒任何人贏了,只有戰爭贏了」)