覆盖$ _SESSION变量类型时的奇怪问题

Joe*_*oey 5 php session overwrite

我总结了问题的关键是尽可能简短:

一个简单的脚本:

<?php
session_start();

$_SESSION['user']="logged";
Run Code Online (Sandbox Code Playgroud)

然后覆盖

$_SESSION['user']=0;  
Run Code Online (Sandbox Code Playgroud)

并显示$ _SESSION内容

var_dump($_SESSION);
Run Code Online (Sandbox Code Playgroud)

显示$ _SESSION ['user']为'0' - 确定,因为它刚刚被覆盖

但是现在看

if ($_SESSION['user']=="logged"){
    echo "logged";
}
else{
    echo "unlogged";
}
Run Code Online (Sandbox Code Playgroud)

输出"已记录"....

似乎变量类型的变化只是肤浅的 - 我不知道我做错了什么..我是否需要使用===比较来包括检查类型?

Mak*_*s3w 4

确实,需要严格比较===

这是因为 PHP 尝试将您的字符串转换为数字,因此“记录”传递为 0

然后 0 == 0

  • (整数)“已记录”= 0
  • (int) "1logged" = 1
  • (整数)“记录1”= 0

http://www.php.net/manual/en/language.types.type-juggling.php