查询字符串可以包含字符串以外的任何内容吗?

我正在工作中从事一个项目,并发现了以下代码:


$queryStringValue = $_GET['var'];


if ( is_string($queryStringValue) )

{

    // Do something.

}

我的问题:调用 is_string() 来检查查询字符串值是否是字符串完全没有必要吗?根据定义,“查询字符串”使我相信数据类型只能是字符串,从而使对 is_string() 的调用变得多余。


我是对的吗?或者有时可以在查询字符串中传递不同的数据类型?


感谢您的任何见解!


Helenr
浏览 96回答 2
2回答

慕妹3146593

根据 PHP 手册中“确定变量类型”下的外部源变量:HTTP 是一种文本协议,大多数(如果不是全部)来自超全局数组的内容(例如 $_POST 和 $_GET)将保留为字符串。PHP 不会尝试将值转换为特定类型。同样,在手册的常见问题解答:HTML 表单中的数组中,我们读到了数组:要将<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']等此外,该手册还$_GET注明了以下内容:注意: GET 变量通过urldecode() 传递。然后,查看签名urldecode:urldecode ( string $str ) : string换句话说,用于预处理$_GET值的函数接受一个字符串并返回一个字符串。显然,当传入一个数组时,它将应用于urldecode该数组的每个字符串值。(如果有人想找到负责生成 的 PHP 源代码部分$_GET,请分享链接,将其包含在此处。)请注意,空值(例如 in ?foo&bar=1)不会导致[foo] NULL,而是导致 in ,[foo] string(0) ""换句话说,结果为零长度string。我们再次得到[bar] string(1) "1". 没有将值类型转换get为post整数、浮点数、布尔值或 null。总之,接收到的可能数据类型$_GET是stringand array(字符串;或进一步的数组;最后的标量“叶子”是字符串)。当然,如果你在 PHP 代码中显式声明$_GET['foo'] = nullor $_GET['bar'] = 1,那么就会有整数和空值。上述内容适用于 PHP 从外部源解析的变量。更新:虽然上述内容对于从查询字符串解析的所有值都是正确的,但对于PHP 从查询字符串中提取的键来说情况有所不同。假设以下 URL: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数组键的标准转换:“包含有效十进制整数的字符串,除非数字前面有 + 号,否则将转换为整数类型。 ”。然而,以下关键转换不会发生:“浮点数也转换为整数,这意味着小数部分将被截断。” 因为(如来自外部源的变量中所述):“[外部]变量名称中的点和空格将转换为下划线。”外部变量类型转换:总结查询字符串的值将始终是strings或以字符串作为最终标量值的数组(数组的)。查询字符串的键将始终是strings,除了被转换为整数的整数(无符号正数:3,-3有符号负数:) 。

达令说

查询字符串本身是 a&nbsp;string,但其中的变量可以解析为stringor&nbsp;array:url.com?var=123=> var 是字符串url.com?var[]=123&var[]=321=> var 是一个数组
打开App,查看更多内容
随时随地看视频慕课网APP