3

私は次のコードを実行しています:

class Foo {  
    private $var = 0;

    function isVarSet () {
           return ($this->var != 0);
    }
}

...

foo = new Foo();

「未定義のプロパティ」の通知が発生します:私のPHPではfoo :: $ var(バージョン5.3.5)。

関数isVarSet()だけを書き直すと:

function isVarSet() {
    if (isset($this->var))
        return ($this->var != 0);
    return false;
}

通知が消えます。

これはわかりません。どちらの場合も$varが設定されていますが、なぜ未定義のプロパティになるのでしょうか。この通知を防ぐためにisset()を使用する必要があるのはなぜですか?また、通知がスコープ演算子::で$ varを参照するのはなぜですか?私は静的クラスを使用していません。インスタンスfooを使用しています。$ foo-> isVarSet()は、定義済みで非静的な$varにアクセスする必要があります。

私はこれに何時間も取り組んでおり、未定義のプロパティ通知に関する他のすべての回答を読んでいますが、これは私が得られないものです。StackOverFlowマスターの皆さん、教えてください。


私のアプリケーションのコード:

<?php

class session {

    private $userId = 0;

    function __construct() {
    session_start();
    $this->setUserId();
    }

    public function isLoggedIn() {
    //if (isset($this->userId))
        return ($this->userId != 0);
    //return false;
    }

    function getUserId() {
    if (isset($this->userId))
        return $this->userId;
    else
        return false;
    }

    private function setUserId() {
    if (isset($_SESSION['userId'])) {
        $this->userId = $_SESSION['userId'];        
    } else 
        unset($this->userId);       
    }

    public function login($user) {
    if ($user != null) {        
        $_SESSION['userId'] = $user->id;
        $this->userId = $user->id;
    }
    }

     public function logout() {
    unset($_SESSION['userId']);
    unset($this->userId);   
    }    
}

$session = new Session();

?>

セッションクラスの呼び出しは次のように行われます。

if ($session->isLoggedIn())
redirectToLocation("../public/index.php");
4

3 に答える 3

2

(全体の編集後)。

この行は何をしていると思いますか (でsetUserId):

 unset($this->userId);

以前のように 0 に設定したいだけかもしれません (ログインしていないことがわかります:

 $this->userId = 0;

または:

 $this->userId = null;

好きなのを選びな。

于 2011-04-05T22:26:50.637 に答える
0

PHP 5.3.5/ウィンドウ

<?php

  function eh($errno, $errstr) {
    echo "[$errno] $errstr";
    }

  set_error_handler('eh');

  class Foo {  
    private $var = 0;

    function isVarSet () {
      return ($this->var != 0);
      }

    public function testVar() {
      return var_export($this->isVarSet());
      }
    }

  $foo = new Foo();
  echo $foo->testVar();

?>

出力は次のとおりです。

false

の場合$var=1、出力は次のとおりです。

true

したがって、ここでは完全に機能します。

于 2011-04-05T21:00:22.953 に答える
-2

最初の例で変数を初期化しなかったためだと思います。最初に、呼び出されるメソッドで変数を初期化する必要があります。その後、初期化されます。これがお役に立てば幸いです。

于 2011-04-05T20:46:10.307 に答える