通过PHP GET传递布尔值

Passing a boolean through PHP GET

这里的问题很简单,虽然不确定答案。 我可以通过get传递布尔变量吗? 例如:

1
http://example.com/foo.php?myVar=true

那我有

1
$hopefullyBool = $_GET['myVar'];

$hopefullyBool是布尔值还是字符串? 我的假设是它是一个字符串,但是有人可以让我知道吗? 谢谢


所有GET参数在PHP中都是字符串。使用filter_varFILTER_VALIDATE_BOOLEAN

Returns TRUE for"1","true","on" and"yes". Returns FALSE otherwise.

If FILTER_NULL_ON_FAILURE is set, FALSE is returned only for"0","false","off","no", and"", and NULL is returned for all non-boolean values.

1
$hopefullyBool = filter_var($_GET['myVar'], FILTER_VALIDATE_BOOLEAN);

获取布尔值类型的另一种方法是传递计算结果为truefalse的内容,例如01

1
2
http://example.com/foo.php?myVar=0
http://example.com/foo.php?myVar=1

然后转换为布尔值:

1
$hopefullyBool = (bool)$_GET['myVar'];

如果要传递字符串truefalse,则另一种方式:

1
$hopefullyBool = $_GET['myVar'] == 'true' ? true : false;

但是我想说filter_varFILTER_VALIDATE_BOOLEAN就是为了这个目的。


如果要避免使用if语句:

1
2
3
4
5
filter_var('true', FILTER_VALIDATE_BOOLEAN);  
//bool(true)

filter_var('false', FILTER_VALIDATE_BOOLEAN);
//bool(false)

它将作为字符串传递。虽然可以使用布尔型转换将其转换,但建议在某些情况下不要这样做。

如果myVar ==" True",您最好这样做

要小心:

1
2
3
4
>>> bool("foo")
True
>>> bool("")
False

空字符串的评估结果为False,但其他所有评估结果为True。因此,不应将其用于任何类型的解析目的。


有几种方法可以做到。首先,我们可以使用PHP的内置(boolean)方法,该方法将字符串值转换为布尔值:

$hopefullyBool = (boolean)$_GET['myVar'];

根据$_GET['myVar']中字符串的值,这将导致布尔值truefalse

从v5.2.1开始,我们还可以使用json_decode()确定布尔值:

$hopefullyBool = json_decode($_GET['myVar]);

json_decode()方法将JSON对象(一个字符串)解析为一个PHP变量,并考虑了类型转换。结果,URL参数中的字符串'true'将被强制转换为布尔值true

您可以同时使用上述两种方法:

$hopefullyBool = (boolean)json_decode($_GET['myVar]);

为了避免在URL参数中传递大写字符(例如?myVar=True?myVar=FALSE),应使用strtolower()方法,该方法会将字符串转换为所有小写字母:

$hopefullyBool = (boolean)json_decode(strtolower($_GET['myVar]));

最后,如果URL的查询字符串中不存在该参数,我们将回退到false,否则PHP将抛出未定义索引通知。为此,我们可以使用isset()方法:

1
2
3
4
$hopefullyBool = false;
if ( isset($_GET['myVar']) ) {
    $hopefullyBool = (boolean)json_decode(strtolower($_GET['myVar]));
}

为了缩短此时间,您可以使用如下条件语句来启动$hopefullyBool

$hopefullyBool = isset($_GET['myVar']) && (boolean)json_decode(strtolower($_GET['myVar']));