2012-01-05 3 views
0

を__setするためのキーとして配列を渡します。は、どのように私は次のように私はPHPのシングルトンセッションクラスを持っている魔法の方法

class Session { 

    static private $_instance = NULL; 

    private function __construct() 
    { 
     session_start(); 
    } 

    /** 
    * Prevents the class from being cloned 
    * @return NULL 
    */ 
    private function __clone() { } 

    /** 
    * Returns the singleton instance of this class 
    * @return Session 
    */ 
    public static function getInstance() 
    { 
     if (!self::$_instance) { 
      self::$_instance = new Session(); 
     } 
     return self::$_instance; 
    } 

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

    public function __set($key, $value) 
    { 
     $_SESSION[$key] = $value; 
    } 

    public function __isset($key) { 
     return isset($_SESSION[$key]); 
    } 

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


} 

$session = Session::getInstance(); 
$session->name = 'some name'; 

を次のように私は、オブジェクトを作成することができます私はまた、問題は、私は、このオブジェクトに配列を渡したいと、それ

echo $session->name; 

のような値を得ることができます動かない。たとえば、私は何かを設定するようにする

$_SESSION['user']['data'] = array('name'=>'some name',"empId"=>'123'); 

私はこのようにしています。

$session->['user']['data'] = array('name'=>'some name',"empId"=>'123'); 

ただし、動作しません。あなたは何が間違っているのかを教えてください。

+2

'$セッション - >ユーザー=配列( 'データ' =>配列( '名前' => 'いくつかの名前'、 "EMPID"=> '123')); ' – Rufinus

+0

@Rufinus:なぜあなたは答えとしてそれを投稿していないのですか? – Gaurav

+1

@Rufinus '$ session-> user = array( 'somekey' => array( 'data'));' - 最初のデータを上書きしませんか?あなたが何かを追加したい場合は、それは意志のコースの – DaveRandom

答えて

0
$session->user = array('data' => array('name'=>'some name',"empId"=>'123')); 

あなたが使用することです

+0

しかし、私は新しいキーを追加したり、後で既存の値を更新する必要があります。だから私はすべての既存のデータを失うだろうか? – codlib

+0

'user'に割り当てられているすべてのデータ、yesですが、いくつかの配列を一緒にマージできるはずです。 – KingCrunch

+0

'$セッション - >ユーザー[「データ」] [「NEWKEY」] =「たnewval」;' – Rufinus

3

この場合の回避策を維持したいあなたはuserで何かを上書きしないようにしてください:あなたは__get()方法を変更する必要が

public function &__get($key) { 
    if (isset($_SESSION[$key])) { 
     return & $_SESSION[$key]; 
    } 
    return NULL; 
} 

を、代入は

$session->user['data'] = ... 

のように割り当てられます。 e [user]キーを押して、新しいサブアレイ[data]を一時的な配列結果に割り当てようとします。

$session->['user']['data']が無効な構文であることに注意してください。 $session->user['data']または$session->{'user'}['data']が必要です。

とにかく、私はおそらく、あなたが頻繁にそのような割り当てを行いたい場合はラッパーを使用するのは良い考えではないと思います。 (私は実際に非常によく似たものを持っています。)

+0

しかし、私は新しいキーを追加したり、後で既存の値を更新する必要があります。だから私はすべての既存のデータを失うだろうか? $ session-> user ['scores'] =何か.... – codlib

+0

Ehm、no。これはまさにこの回避策が避けることができるものです。 – mario