7

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

有一个 Permissions.php 类,如果登录或 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 函数的代码不起作用?


经过进一步测试,多亏了您的一些精彩评论,事实证明这get_user()不是返回 NULL,而是(bool)false(来自 var_dump)。为什么会出现这种奇怪的行为?我的类在顶部清楚地将其设置为 NULL,并且函数将变量返回为 false?

4

1 回答 1

3

因为!=不检查类型(null 是一种类型)并get_user()返回类似于空字符串或 false 的内容(请参阅PHP 类型比较表)。

检查以下输出:

var_dump(Permissions::instance()->get_user());
于 2013-03-13T10:14:55.530 回答