7

ユーザーがログインしており、特定の部門に属しているかどうかを検出する if ステートメントがあります。それは本当にとても簡単です。

ログインまたは NULL の場合に User オブジェクトを返す Permissions.php クラスがあります。

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 に答える