代码之家  ›  专栏  ›  技术社区  ›  dan

php中的if语句不考虑false大小写

php
  •  -1
  • dan  · 技术社区  · 3 年前

    PHP对我来说还是个新手,所以如果我在这里遗漏了一些基本的东西,请原谅。

    我有一些非常简单的代码:

    echo $_GET['initState'];
    
                if ($_GET['initState']) {
                    $num = 10;
                }
                else {
                    $num = PHP_INT_MAX;
                }
    
                echo $num;
    

    当我查看日志时,我会看到以下内容:false 10

    所以initState是false,但是num被赋值为10

    但当我将代码更改为以下内容时:

    echo $_GET['initState'];
    
                if ($_GET['initState'] == 1) {
                    $num = 10;
                }
                else {
                    $num = PHP_INT_MAX;
                }
    
                echo $num;
    

    我的输出现在工作正常:false9223372036854775807

    我在这里错过了什么?

    以下是@GET代码:

    @GET("getreleases.php")
        Call<ReleaseModelResponse> getReleases(@Query("initState") boolean initState);
    

    感谢您在这里提供的任何见解。

    编辑 事实上,也许我的代码在这两种情况下都不能正常工作,这就是为什么我已经仔细研究这个问题一段时间了。我注意到我的活动总是加载超过10个项目,所以这一定意味着这两个版本的代码都不适合我。

    可以肯定的是,在执行导致initState为true的操作时,我再次检查了日志,我看到的是:true9223372036854775807

    1 回复  |  直到 3 年前
        1
  •  1
  •   Crimin4L    3 年前

    在代码的第一个版本中,if语句检查的值是否为 $_GET['initState'] 是“真实的”。在PHP中,任何非空字符串、非零值或非零值都被认为是“truthy”。所以即使的价值 $_GET['init状态'] 是“虚假的”,在if语句中仍然被认为是“真实的”;因此$num被赋予值10。

    在代码的第二个版本中,您将显式检查的值 $_GET['init状态'] 等于1。由于它不等于1,所以执行else块,并且 $num 被分配了的值 PHP_INT_MAX .

    看起来您在REST API中使用此代码,并在查询参数中发送布尔值,但在PHP中,布尔值不会直接传递到查询参数中,而是作为字符串“true”或“false”传递,因此在代码的第一个版本中 $_GET['init状态'] 是“false”字符串,它被认为是truthy,但在第二个版本中,的值 $_GET['init状态'] 是“假”字符串,您将其与1进行比较,1不相等,也不真实。

    你可以试着改变 if($_GET['initState'] == 1) 到 if($_GET['initState'] === "true") 或 if($_GET['initState'] == true) ,这将检查布尔值而不是字符串。

    推荐文章