Почему строки в $ _POST не могут содержать точку "."?

По сути, название говорит, что все. У меня был скрытый ввод на моей странице, где я хотел установить имя "some.major.uber.setting"

например: <input type="hidden" name="some.major.uber.setting" value="dummy value" />

и когда я посмотрел на данные $ _POST, он содержал «some_major_uber_setting». Может ли кто-нибудь объяснить это поведение?

Это, вероятно, реликт от register_global = В разы. $ _GET / $ _ переменные POST превратились в стандартные переменные ($ _GET ['foo'] стал $ foo). Имена переменных не могут содержать точки, поэтому они были внутренне преобразованы.

Это было с момента первоначальной фиксации CVS , более 10 лет назад.

Он имеет комментарий:

/ * убедитесь, что у нас нет пробелов или точек в имени переменной (не бинарный сейф) * /

Я понятия не имею, почему это не «двоичный сейф» … Вам нужно будет спросить Зеева.

Текущая ссылка: https://github.com/php/php-src/blob/master/main/php_variables.c#L93

Его документально подтвержденный на php.net :

Точки и пробелы в именах переменных преобразуются в символы подчеркивания.

Как уже упоминалось в моем другом ответе, это функция, которая устраняет это неудачное поведение.

 function fix(&$target, $source, $discard = true) { if ($discard) $target = array(); $source = preg_replace_callback( '/(^|(?<=&))[^=[&]+/', function($key) { return bin2hex(urldecode($key[0])); }, $source ); parse_str($source, $post); foreach($post as $key => $val) $target[ hex2bin($key) ] = $val; } 

И тогда вы можете вызвать эту функцию следующим образом:

 fix($_POST, file_get_contents('php://input'));