在我的项目中,我有一个用于$_SESSION
的包装类,因此会话变量可以通过$session->var
访问。我试图检查是否设置了会话变量isset
:
if (!isset($this->session->idUser)) {
...
}
但isset
没有返回任何东西。所以在我的包装类中,我编写了以下函数来测试发生了什么。
public function isItSet($var)
{
die(isset($_SESSION["id"]));
}
这将导致空白页。我试过了:
public function isItSet($var)
{
die(is_null(isset($_SESSION["id"])));
}
仍然是一张空页。然后我尝试了:
public function isItSet($var)
{
die(isset($_SESSION));
}
这将返回 1。
谁能告诉我为什么尝试检查是否设置了会话变量,什么也没返回?
为了支持isset()
,您需要在包装器中重载函数。
因此,在您的包装器中添加:
public function __isset($var){
return isset($_SESSION[$var]);
}
要使用它,您只需要执行以下操作:
isset($this->session->myVar);
如果仍然无法正常工作,请执行以下操作:
var_dump($_SESSION)
这将转储整个 $_SESSION 数组,并显示您正在检查的变量是否确实存在。
在我看来,问题与测试有关,而不是与 PHP 会话有关。
会话变量 isset 不返回任何内容背后的主要原因是使用die((函数,根据 PHP 手册本身等效于 exit((。
http://in1.php.net/die
因此,请改用 var_dump((。
isset 返回一个空页面,因为您的变量在会话中不存在,因此 isset 返回 false,但是,回显 false 返回 ''。
它已经写在哈克雷
的评论中您可以像这样测试:
echo "false : " . false . "'n";
echo "true : " . true . "'n";
=>
false :
true : 1
因此,对于您的测试,请执行var_dump($_SESSION)
,您将看到isset($_SESSION['id'])
返回 false 是否正常。
你也可以测试: die("false : " . (false == isset($_SESSION['id'])));
你的结果基本上是正确的。
我认为传递给每个函数的布尔值只会让您感到困惑。
这里有一个清晰的解释,你的每个陈述会发生什么。
让我们一一得到
// declaring this array as a set of session being passed as sample.
$string = array('name'=>'kaii');
echo die(isset($string['id'])); // figure 1
// step
// isset($string) returns a value of false because of unexistent of an array with the name of id.
// die(false) returns nothing because of the value being passed by isset is false.
// result would be definitely empty
echo die(is_null(isset($string['id']))); // figure 2
// step
// isset($string) returns a value of false because of unexistent of an array with the name of id.
// is_null(false) returns a value of false because it only accepts NULL as its parameter value to return true.
// die(false) returns nothing because of the value being passed by is_null is false.
// result would be definitely empty
echo die(isset($string)); //figure 3
// step
// isset($string) returns a value of true because of a $string variable is set and exist.
// die(true) returns a value of 1 because of the value being passed is true which is equivalent to 1 .
// result would be definitely return a value of 1.
注意:一般来说,您的陈述是正确的,只需要一些理由来支持它。
附加:
print_r()
, var_dump()
- 使用它来检查您的会话是否具有您尝试的名称宣布。
简要说明:
isset()
- 返回布尔值
true
或false
is_null()
- 仅接受
NULL
参数值以返回布尔值true
否则它会false
.
die()
- 对于
true
返回值 1,对于false
返回空值。
原因:
- 布尔
TRUE
值将转换为字符串"1"。布尔FALSE
转换为 ">
isset 函数:如果 var 存在并且具有 NULL 以外的值,则返回 TRUE,否则返回 FALSE。如果会话变量已设置,则给出 TRUE,如果会话变量未设置,则给出 FALSE。
例:
$_SESSION['views']=1;
会话变量设置。=> 给出 TRUE
unset($_SESSION['views']);
会话变量未设置。=> 在此if(isset($_SESSION[$var]))
之后,它给出 FALSE
有两个选项:会话变量是否设置。
isset(( 仅适用于变量,因为传递任何其他内容都会导致解析错误。要检查是否设置了常量,请使用 defined(( 函数。
有关isset的更多信息,请单击此处
您可以尝试以下几件事:
将此添加到您的代码库:http://philsturgeon.co.uk/blog/2010/09/power-dump-php-applications。它比var_dump
好得多,您可以清楚地看到布尔值的真假。这让我省去了不少悲伤。
其次,die()
并不总是能给我我所期望的,所以最好先echo
一些东西,然后再die()
。
如@doydoy44所述,false
输出一个空白,因此您可能有充分的理由得到一个空白页。同样,上面的链接将解决此问题并使事情更加清晰。
上面的原始代码idUser
为正在检查的变量,所有其他示例都使用 id
。我想你知道这一点,但我想我会提到它以防万一。
最后,我会交叉检查会话包装器是否按预期工作,例如
if (!isset($this->session->idUser)) {
dump($_SESSION);
dump($this->session);
}
我显然希望从他们俩那里得到相同的内容。
希望这有所帮助。
从外观上看,会话数组上似乎没有"ID"键。这在您对 F21 答案的评论中得到了验证("未定义的索引错误"(。
您可以做的是在会话启动后定义/初始化会话数组上的"ID"键,其值为 null 或空字符串 "。然后稍后用您的代码填充您的值。
这是为了确保在使用 isset($_SESSION["ID"] 时,结果可以是真或假,而不是未定义的索引错误。
会话变量有点神奇。没有历史上的魔力那么神奇,但观察到不寻常的事情仍然不足为奇。
以三种状态运行问题中的测试是有意义的:一次设置了会话变量,两次没有设置会话变量 - 一次使用不同的会话变量集,一次使用未设置会话变量。
调整 F21 的答案,以支持 isset((,您需要在包装器中重载函数。在这样做的同时,您还可以创建一个按预期运行的 isset。
类似于以下内容的内容将解决"false 是不可见的"和删除会话值的问题。
public function __isset($var){
if (isset($_SESSION[$var]) && $_SESSION[$var]."">"") {
return true;
} else {
return false;
}
}