Можно ли сохранить экземпляр класса в пространстве $_SESSION?

 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", он возвращает мне нулевое значение.

Ответ 1

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

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

и

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

Просто убедитесь, что класс определен прежде, чем выполнить неэриализацию объекта.

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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