1

我在工作中从事一个项目,并遇到了以下代码:

$queryStringValue = $_GET['var'];

if ( is_string($queryStringValue) )
{
    // Do something.
}

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

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

感谢您的任何见解!

4

3 回答 3

2

根据“确定变量类型”下的来自外部源的变量的 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']等。

此外,手册$_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". 没有将getpost值类型转换为整数、浮点数、布尔值或空值。

总之,接收到的可能数据类型$_GETstringarray(字符串的;或进一步的数组;最终的标量“叶子”是字符串)。当然,如果你在你的 PHP 代码中显式声明$_GET['foo'] = null或声明$_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,但整数(无符号正数:3、有符号负数:)除外-3,它们被转换为整数
于 2020-08-08T21:12:02.717 回答
1

查询字符串本身是 a string,但其中的变量可能被解析为stringor array

url.com?var=123=> var 是字符串

url.com?var[]=123&var[]=321=> var 是一个数组

于 2020-08-08T18:15:21.363 回答
-4

是的,它包含。它可以是你想要的任何类型,包括数组、整数、浮点数等。

于 2020-08-08T17:37:22.037 回答