По сути, название говорит, что все. У меня был скрытый ввод на моей странице, где я хотел установить имя "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'));