未设置PHP会话false

未设置PHP会话false,php,session,Php,Session,将false值设置为session时,会设置会话,但该值为空。类型为布尔型。 此代码: <?php session_start(); $_SESSION["IsMobile1"] = false; $_SESSION["IsMobile2"] = true; //header("location: ../../../index.php"); echo "IsSet1: " . isset($_SESSION["IsMobile1"]) . "; Is

将false值设置为session时,会设置会话,但该值为空。类型为布尔型。 此代码:

<?php
    session_start();
    $_SESSION["IsMobile1"] = false;
    $_SESSION["IsMobile2"] = true;
    //header("location: ../../../index.php");
    echo "IsSet1: " . isset($_SESSION["IsMobile1"]) . "; IsMobile1: " . $_SESSION["IsMobile1"] . "; type: " . gettype($_SESSION["IsMobile1"]) . ";<br>";
    echo "IsSet2: " . isset($_SESSION["IsMobile2"]) . "; IsMobile2: " . $_SESSION["IsMobile2"] . ";<br>";
?>
我的PHP版本是5.5.13。 这是预期的行为吗?我正在尝试使用以下代码阅读会话:

if (isset($_SESSION["IsMobile"]))
    {
        if (is_bool($_SESSION["IsMobile"]))
        {
            header("location: Mobile/");
            exit;
        }
    }

但它当然不起作用,因为IsMobile是空布尔值。(在原版中,我只使用IsMobile。IsMobile1和IsMobile2只是为了测试。)

类似于:

if (!empty($_SESSION["IsMobile"]))
{
  header("location: Mobile/");
  exit;
}

尝试使用严格运算符

$_SESSION['IsMobile'] === TRUE

我本人曾多次面对这一问题,虽然尚未得到证实,但我得出了以下结论:

由于
boolean
类型不能用作1或0的常量,因此它只是在打印或任何其他输出尝试时转换为
int
。但这只发生在
真的
FALSE
始终(或至少在大多数情况下)保持为空(我从未见过
bool
var输出
FALSE

但好消息是,如果在
if
语句中使用定义为
FALSE
的变量,它将被解释为
FALSE
(如预期的那样)

那么,如果要输出它们,该怎么办

输出字符串:

if ($_SESSION["IsMobile"] == FALSE) {
    echo "FALSE";
}
更新哦,是的,以下是我在文档中遗漏的内容:

布尔真值转换为字符串“1”。布尔值为FALSE 已转换为“”(空字符串)。这允许来回转换 在布尔值和字符串值之间


is\u bool
告诉您正在处理一个布尔值。它不检查该变量是真是假。你不能呼出
false
这在PHP中是什么都不是,就像nullTrue一样。我的意思是filter\u var不是布尔值,filter\u var(“”,filter\u VALIDATE\u BOOLEAN);返回false,这是预期行为。From:btw
isset()
如果数组索引存在并设置了值,但值为null,则返回false。或者,如果只想检查密钥是否存在,可以使用
array\u key\u exists()
。如果此代码在某些情况下可能在根本不存在$\u会话变量的情况下运行,则可以在调用
array\u key\u exists()
之前通过检查
isset($\u SESSION)
将两者结合起来。这并不是说代码错误,而是想指出它实际上并没有检查会话变量是否设置为false,但是检查它是否是错误的,因为只使用了
=
而不是
==
。我想知道PHP会话是否能够在整个会话中将数据保持为bool类型,或者在某个时候它是否会转换为字符串。
if ($_SESSION["IsMobile"] == FALSE) {
    echo "FALSE";
}