Ответ 1
Это, вероятно, реликт из register_global = В разы. $_GET/$_ переменные POST превратились в стандартные переменные ($ _GET ['foo'] стал $foo). Имена переменных не могут содержать точки, поэтому они были внутренне преобразованы.
В общем, название говорит все. У меня был скрытый ввод на моей странице, где я хотел установить имя "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'));