根据“确定变量类型”下Variables From External Sources 的 PHP 手册:
HTTP 是一个文本协议,如果不是全部的话,大多数超全局数组中的内容,如 $_POST 和 $_GET 将保留为字符串。 PHP 不会尝试将值转换为特定类型。
同样,在手册的FAQ: Arrays in HTML Form 中,我们阅读了数组:
要将您的 <form> 结果作为数组发送到您的 PHP 脚本,您可以将 <input>、<select> 或 <textarea> 元素命名为:
<input name="MyArray[]" /> ...
这将变成查询字符串?MyArray[]=foo&MyArray[]=bar 等,可用作$_GET['MyArray'][0] 和$_GET['MyArray'][1]。您还可以使用命名键;查询?var[x]=one&var[y]=two 将产生关联数组$_GET['var] = ['x' => 'one', 'y' => 'two'];而?var[x][]=deep 将变为$_GET['var']['x'] = ['deep'],等等。
此外,manual for $_GET 指出以下几点:
注意:
GET 变量通过urldecode() 传递。
那么,看urldecode的签名:
urldecode ( string $str ) : string
换句话说,用于预处理$_GET 值的函数接受一个字符串并返回一个字符串。显然,当有一个数组传入时,它会将urldecode 应用于该数组的每个字符串值。 (如果有人想找到负责生成$_GET的PHP源代码部分,请分享链接,将其包含在此处。)
注意一个空值,例如在?foo&bar=1 中,不会导致[foo] NULL,而是[foo] string(0) "",换句话说,一个零长度string。同样,我们得到[bar] string(1) "1"。没有将 get 或 post 值类型转换为整数、浮点数、布尔值或 null。
总之,$_GET 中接收的可能数据类型是 string 和 array(字符串;或更多数组;最后的标量“叶子”是字符串)。当然,如果你在 PHP 代码中显式声明了$_GET['foo'] = null 或$_GET['bar'] = 1,那么就会有整数和空值。以上适用于 PHP 从外部源解析的变量。
更新:虽然以上对于从查询字符串解析的所有 values 都是正确的,但对于 PHP 从一个查询字符串。假设以下网址:
test.php?101=foo&202=bar&dev=ops
现在,var_dump(array_keys($_GET)) 将为数字键返回什么?整数,而不是字符串:
array(3) {
[0] · int(101)
[1] · int(202)
[2] · string(3) "dev"
}
这与 PHP 的 standard casting of array keys 一致:“包含有效十进制整数的字符串,除非数字前面有 + 号,否则将被强制转换为整数类型。”。然而,以下键转换不会发生:“浮点数也转换为整数,这意味着小数部分将被截断。”因为(如 Variables from External Sources 中所述):“点[external] 变量名中的空格被转换为下划线。”
外部变量类型转换:总结
- 查询字符串的值将始终是字符串,或数组(数组中的),字符串作为其最终标量值。
- 查询字符串的 keys 将始终是 strings,但转换为 3,有符号负数:
-3)除外>整数。