在我的项目中,我有$_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.
任何人都可以告诉我为什么尝试检查会话变量是否设置何时返回?
答案 0 :(得分:8)
要支持isset()
,您需要重载包装器中的函数。
所以,在你的包装器中,添加:
public function __isset($var){
return isset($_SESSION[$var]);
}
要使用它,您只需要:
isset($this->session->myVar);
如果仍然无效,请执行:
var_dump($_SESSION)
这将转储整个$ _SESSION数组,并显示您要检查的变量是否确实存在。
答案 1 :(得分:3)
在我看来,问题与测试有关,而与PHP会话无关。
MAIN REASON 背后为什么会话变量isset返回什么都没有使用 的模具()强> 根据PHP手册本身等同于exit()的函数。
所以,改为使用var_dump()。
答案 2 :(得分:1)
isset返回一个空页面,因为你的变量在session中不存在,所以isset返回false,但是,echo false返回''。
它已经写在了对hakre的评论中
你可以这样测试:
echo "false : " . false . "\n";
echo "true : " . true . "\n";
=>
false :
true : 1
因此,对于您的测试,请执行var_dump($_SESSION)
,您将看到isset($_SESSION['id'])
返回false是否正常。
您还可以测试:die("false : " . (false == isset($_SESSION['id'])));
答案 3 :(得分:1)
您的结果基本上是正确的。
传递给每个函数的布尔值让我觉得困惑。
明确解释你的每一个陈述会发生什么。
让我们一个接一个
// 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
已转换为“”答案 4 :(得分:0)
isset函数:如果var存在并且其值不是NULL,则返回TRUE,否则返回FALSE。 如果会话变量设置为TRUE,如果会话变量未设置,则给出FALSE。
示例:
$_SESSION['views']=1;
会话变量已设置。 =&GT;给出TRUE
unset($_SESSION['views']);
会话变量。
=&GT;在此if(isset($_SESSION[$var]))
之后,它给出了FALSE
有两种选择:会话变量是否已设置。
isset()仅适用于变量,因为传递任何其他内容都会导致解析错误。要检查是否设置了常量,请使用defined()函数。
答案 5 :(得分:0)
你可以尝试一些事情:
将此添加到您的代码库:http://philsturgeon.co.uk/blog/2010/09/power-dump-php-applications。它比var_dump
好得多,您可以清楚地看到布尔值的 true 或 false 。这给我带来了很多悲伤。
其次,die()
并不总能给我我的期望,所以echo
更好,然后die()
。
正如@ doydoy44所提到的,false
会输出一个空白,因此您可能会因为某个原因而得到一个空白页面。同样,上面的链接将解决这个问题并使事情变得更加清晰。
上面的原始代码idUser
作为要检查的变量,您的所有其他示例都使用id
。我假设你知道这一点,但我想我会提到它以防万一。
最后,我会反复核对会话包装器是否正常工作,例如
if (!isset($this->session->idUser)) {
dump($_SESSION);
dump($this->session);
}
我显然希望从这两者中获得相同的内容。
希望有所帮助。
答案 6 :(得分:0)
从外观上看,似乎没有&#34; ID&#34;会话数组上的键。 这已在您对F21答案的评论中得到验证(&#34;未定义的索引错误&#34;)。
您可以做的是定义/初始化&#34; ID&#34;键入会话数组,其值为null或空字符串&#34;&#34;会话开始后。然后在您的代码中使用您的值填充它。
这是为了确保在使用isset($ _ SESSION [&#34; ID&#34;]时,结果可以是true或false,而不是未定义的索引错误。
答案 7 :(得分:0)
会话变量有点神奇。比历史上更少的魔力,但是观察到不寻常的事情仍然不足为奇。
在三个状态下运行问题中的测试是有意义的:一次使用会话变量设置,两次没有设置会话变量 - 一次使用不同的会话变量设置,一次没有设置会话变量。
调整F21的答案,支持isset(),你需要重载包装器中的函数。在这样做的同时,您也可以创建一个按预期运行的isset。
以下内容将解决'false is invisible'和删除会话值的问题。
public function __isset($var){
if (isset($_SESSION[$var]) && $_SESSION[$var]."">"") {
return true;
} else {
return false;
}
}