Php 为什么$u POST中的字符串不能包含点&引用;?

Php 为什么$u POST中的字符串不能包含点&引用;?,php,post,Php,Post,基本上,标题说的就是这些。我的页面上有一个隐藏的输入,我想将名称设置为“some.major.uber.setting” 例如: 当我查看$u POST数据时,它包含“一些主要的uber设置”。有人能解释一下这种行为吗?这很可能是《时代》杂志上的一篇文章$\u GET/$\u POST变量被转换为标准变量($\u GET['foo']变成了$foo)。变量名不能包含点,因此它们在内部进行了转换。其记录如下: 变量名中的点和空格转换为下划线 这是从10多年前的第一次世界大战开始的 它有一个评论:

基本上,标题说的就是这些。我的页面上有一个隐藏的输入,我想将名称设置为“some.major.uber.setting”

例如:


当我查看$u POST数据时,它包含“一些主要的uber设置”。有人能解释一下这种行为吗?

这很可能是《时代》杂志上的一篇文章<代码>$\u GET/
$\u POST
变量被转换为标准变量(
$\u GET['foo']
变成了
$foo
)。变量名不能包含点,因此它们在内部进行了转换。

其记录如下:

变量名中的点和空格转换为下划线


这是从10多年前的第一次世界大战开始的

它有一个评论:

/*确保变量名中没有空格或点(不是二进制安全的)*/

我不知道为什么它不是“二进制安全的”。。。你得问问泽夫


当前链接:

正如我在另一个答案中提到的,这是修复这种不幸行为的函数

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;
}

OP知道这一点——这是问题的一部分,即“为什么?”只是为了澄清,我已经将register_global设置为Off,这就是为什么我说它是一个遗物。php内核在默认情况下用下划线替换点。这种行为必须是在register_globals中引入的,并且在删除它之后保持不变(或者至少在默认情况下禁用它)。为什么不呢
是一个PHP操作符。
fix($_POST, file_get_contents('php://input'));