2012-01-05 5 views
0

У меня есть класс сеанса singlep php, как показано ниже.Как передать массив как ключ к методу __set magic

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

'$ session-> user = array ('data' => array ('name' => 'some name'," 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')); 

Убедитесь, что вы ничего не перезаписать в user вы хотите сохранить

+0

Но мне нужно добавить новый ключ или обновить существующее значение позднее. Значит, я потеряю все существующие данные? – codlib

+0

Все данные, которые присваиваются 'user', да, но вы должны иметь возможность объединить несколько массивов вместе. – KingCrunch

+0

'$ session-> user ['data'] ['newkey'] = 'newval';' – Rufinus

3

обходной путь в данном случае было бы использовать:

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

Вам нужно изменить метод __get() , поскольку присвоение, такое как

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

будет фактически отбираться e ключ [user], а затем попытайтесь назначить новый подмассив [data] для этого временного массива.

Также обратите внимание, что $session->['user']['data'] является недопустимым синтаксисом. Вам либо нужен $session->user['data'], либо $session->{'user'}['data'].

В любом случае, я думаю, что, вероятно, не рекомендуется использовать обертку, если вы часто хотите выполнять такие задания. (У меня действительно есть что-то очень похожее.)

+0

Но мне нужно добавить новый ключ или обновить существующее значение позже. Значит, я потеряю все существующие данные? $ session-> user ['scores'] = something .... – codlib

+0

Ehm, no. Это именно то, что обходное решение может избежать. – mario

Смежные вопросы