Php 在CodeIgniter 3.x中使用empty()和isset()检查会话变量

Php 在CodeIgniter 3.x中使用empty()和isset()检查会话变量,php,session,codeigniter-3,Php,Session,Codeigniter 3,使用CodeIgniter 3.0.3,文档说明可以通过几种不同的方式检索会话数据,包括$\u session['item']和$this->session->item。这是真的。无论我如何设置session变量,我发现我都可以双向回显该值 现在,填充了会话变量后,我可以检查如下空条件:if(empty($\u session['item']),它的计算结果与我预期的一样为bool(false)。但是,如果我以这种方式检查相同的会话变量:if(empty($this->session->item

使用CodeIgniter 3.0.3,文档说明可以通过几种不同的方式检索会话数据,包括
$\u session['item']
$this->session->item
。这是真的。无论我如何设置session变量,我发现我都可以双向回显该值

现在,填充了会话变量后,我可以检查如下空条件:
if(empty($\u session['item'])
,它的计算结果与我预期的一样为
bool(false)
。但是,如果我以这种方式检查相同的会话变量:
if(empty($this->session->item))
它的计算结果为
bool(true)
,这不是我所期望的(因为我可以在下一行回显它的值)。为什么这两种检查空条件的不同方法的计算结果不同?

这是由于empty()的工作方式不同。比较此报价:

empty($registry->notEmpty)的结果有点未指定,因为该值显然已设置且为非空。这是因为在这些情况下,empty()函数使用了_isset()magic functin。尽管上面的文档中已经提到了这一点,但我认为值得更详细地提及,因为行为并不简单。为了获得所需的(expexted?)结果,您需要向类中添加_isset()魔术函数:


(摘自php.net:,来自用户Janci的评论)

Wow。这是奇怪的行为。如果变量有一个值(特别是一个标量值)可以回显到屏幕上,那么
empty()
函数会认为它是空的,这有点可怕。