is_null 函数在我的 if 语句中无法正常工作

Posted

技术标签:

【中文标题】is_null 函数在我的 if 语句中无法正常工作【英文标题】:is_null function not working properly in my if statement 【发布时间】:2013-03-01 04:38:15 【问题描述】:

我有一个 if 语句来检测用户是否已登录并属于某个部门。真的很简单。

有一个 Permissions.php 类,如果登录则返回 User 对象或为 NULL。

protected $user = NULL;
...
public static function instance() 
  if(!self::$instance) 
    self::$instance = new Permissions();
  
  return self::$instance;

...
public function get_user() 
  return $this->user;

然后是 user.php 类,它具有返回它们所在分区的函数:

public function is_manager() 
  return $this->is_manager;

所以我应该能够做到以下几点:

if(Permissions::instance()->get_user()->is_manager())

当然,这可能会引发有关 NULL 对象的警告,所以我认为您可以执行以下操作:

if( ( ! is_null( Permissions::instance()->get_user() ) ) &&
    ( Permissions::instance()->get_user()->is_manager() ))

哪个应该检查null,如果没有,它应该评估if语句的另一半,但是PHP出于某种原因,评估了所有它并且仍然抱怨一个NULL对象(当用户没有登录时)。

然后我把 if 语句分解成一个嵌套的 if 语句,PHP 仍然抱怨 null 对象,这让我相信 is_null 方法没有按预期工作。

这最终奏效了:

if (Permissions::instance()->get_user() != NULL) 
  if(Permissions::instance()->get_user()->is_manager())
    ...
  

我的问题是,为什么我的带有 is_null 函数的代码不起作用?


经过进一步测试,感谢您的一些出色的 cmets,事实证明 get_user() 没有返回 NULL,而是 (bool)false(来自 var_dump)。为什么会出现这种奇怪的行为?我的班级在顶部明确将其设置为NULL,并且函数将变量返回为false?

【问题讨论】:

有趣。这是否可以在 Ignite.io 或 3v4l.org 等小提琴网站上重现? 你试过empty()函数了吗?这是一个全部:php.net/manual/en/function.empty.php 如果您在工作示例if (Permissions::instance()->get_user() !== NULL) 中进行严格比较会发生什么?如果它失败了,那么你的问题在别处,而不是is_null 您是否尝试在 Permissions::instance()->get_user() 上进行变量转储?或者在 Permissions::instance() 上上课?这些应该有点信息。 @Husman ignite.io/code/51405573ec221e4024000000 我似乎无法重现它。我问 you 是否可以重现它的原因是因为这看起来不太可能,而且你很可能在其他地方错过了一些东西。而且通过重现错误,可能有助于找出问题所在。 【参考方案1】:

因为!= 不检查类型(null 是一种类型)并且get_user() 返回类似空字符串或假的内容(参见PHP type comparison table)。

检查输出:

var_dump(Permissions::instance()->get_user());

【讨论】:

你的权利输出是'(bool)false',这很奇怪,因为变量设置为NULL,并且在任何时候都没有设置为false。 “它绝不会被设置为 false” - 你一定忽略了一些事情,即使在 PHP 中变量也不会无故改变。

以上是关于is_null 函数在我的 if 语句中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

变量在我的if else语句中没有更新

JUnit的断言 Assert

if语句中的ERRORLEVEL无法正常工作[关闭]

断言(assert)的用法

如何在 jquery 中的 if 和 else 中进行数学运算?

C语言-if语句问题