1

セッション変数に魔法のゲッター/セッター クラスを使用していますが、通常のセッターとゲッターの違いがわかりません。

コード:

class session
{
    public function __set($name, $value)
    {
        $_SESSION[$name] = $value;
    }

    public function __unset($name)
    {
        unset($_SESSION[$name]);
    }

    public function __get($name)
    {
        if(isset($_SESSION[$name]))
        {
            return $_SESSION[$name];
        }
    }
}

最初に気付いたのは$session->_unset('var_name')、変数を削除するために呼び出す必要があることです。それについては「魔法のような」ことは何もありません。

第二に、これを使用しようとすると$session->some_var機能しません。を使用してのみセッション変数を取得できます$_SESSION['some_var']

PHPのマニュアルを見ましたが、関数は私のものと同じように見えます。

私は何か間違ったことをしているのですか、それともこれらの関数について何か魔法はありませんか?

4

4 に答える 4

1

ゲッターとセッターはクラス内の変数用だと思いましたか?

class SomeClass {
    private $someProperty;

    function __get($name) {
        if($name == 'someProperty') return $this->someProperty;
    }

    function __set($name, $value) {
        if($name == 'someProperty') $this->someProperty = $value;

    }
}


$someClass = new SomeClass();
$someClass->someProperty = 'value';
echo $someClass->someProperty;

?

于 2010-04-05T19:35:23.947 に答える
1
class session { /* ...as posted in the question ... */ }

session_start();
$s = new session;
$s->foo = 123;
$s->bar = 456;
print_r($_SESSION);

unset($s->bar);
print_r($_SESSION);

版画

Array
(
    [foo] => 123
    [bar] => 456
)
Array
(
    [foo] => 123
)

わかりました、多分「魔法」ではありません。しかし、意図したとおりに動作します。
それがあなたが望むものではない場合は、詳しく説明してください...

于 2010-04-05T19:40:38.330 に答える
1

最初の問題、あなたが電話したとき

unset($session->var_name);

呼び出しと同じはずです

$session->_unset('var_name');

__get(); が使えない件について 何がうまくいかないのですか?変数は何に設定され、どのような警告が表示されますか。error_reporting()E_ALLに設定されていることを確認してください。

また、電話したことを確認することをお勧めします。session_start

于 2010-04-05T19:36:18.260 に答える
0

これは、魔法の機能についての今までの私の理解です

間違っていたら訂正お願いします...

$SESSION はオブジェクトではなく配列であるため、$session->field ではなく $session['field'] を使用してアクセスできます

マジック関数を使用すると、関数の前に関数名 __fnName を次のように使用できます。

fnNameNewField($値);

そのため、キーとして NewField に分割され、__fnName に送信され、これに対して操作が行われます

例: setNewId($value) は、key= new_id および Parameters... とともに __set() に送信されます。

于 2014-01-28T11:08:19.670 に答える