Могу ли я сохранить экземпляр класса в пространстве $ _SESSION? - PullRequest
12 голосов
/ 16 августа 2011
 Class User{

public $id;
public $username;
public $password;
public $email;
public $steam;
public $donator;
public $active;

public function __construct($username, $email, $password, $id, $active, $donator, $steam){
    $this->id = $id;
    $this->username = $username;
    $this->password = $password;
    $this->email = $email;
    $this->steam = $steam;
    $this->donator = $donator;
    $this->active = $active;
}}

- это мой класс (упрощенно)

ниже - мой код:

$_SESSION['loggedIn'] = $user;

$ user - это экземпляр класса User

, теперь эточто print_r ($ _ SESSION ['loggedIn']) показывает мне:

    __PHP_Incomplete_Class Object
(
    [__PHP_Incomplete_Class_Name] => User
    [id] => 22
    [username] => xxxx
    [password] => xxxx
    [email] => xxxx
    [steam] => 1234567
    [donator] => 0
    [active] => 1
)

, в котором xxxx - это правильные значения.

, но когда я пытаюсь получить данные из моего сеанса.вот так: "$ _SESSION ['loggedIn'] -> username" возвращает мне нулевое значение.

Ответы [ 4 ]

13 голосов
/ 16 августа 2011

Сначала необходимо сериализовать объект в строку:

$_SESSION['user'] = serialize($user);

и:

$user = unserialize($_SESSION['user']);

Просто убедитесь, чтокласс сначала определяется перед десериализацией объекта.

12 голосов
/ 16 августа 2011

Вы можете хранить объекты в $_SESSION. PHP будет сериализовать их для вас. Просто убедитесь, что класс определен перед вызовом session_start, или что он может быть с автозагрузкой . Причина, по которой значение, хранимое в сеансе, имеет тип "__PHP_Incomplete_Class_Name", заключается в том, что класс User не был определен, когда объект был не сериализован во время загрузки сеанса (как объяснено на странице руководства PHP по сериализация объекта ).

Ресурсы не могут быть сериализованы. Если вы когда-либо сохраняете объект, который использует ресурсы, реализуйте __sleep и __wakeup для настройки сериализации. Сериализация PHP должна быть способна обрабатывать все другие типы, даже если они содержат циклические ссылки.

2 голосов
/ 16 августа 2011

Находясь на той же странице, переменная session действует как еще одна переменная, поэтому вы можете делать с ней все, что захотите. Вот почему вы можете хранить объект, находясь еще на этой странице.

Извлечение этого позже фактически покажет, подходит ли оно для session, чего нет в вашем случае.

Если вам действительно нужно сохранить этот объект, вы можете попробовать сохранить его как сериализованный объект и десериализовать его после извлечения. Это должно работать, хотя я не знаю, является ли это лучшим решением / дизайном. Обход объектов вокруг, как это может быть немного ... анти-шаблон

0 голосов
/ 16 августа 2011

$_SESSION переменные могут хранить только массивы, числа и строки.

Они не могут хранить объект класса после перехода на новую страницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...