Сериализация объектов PHP и сессии - PullRequest
4 голосов
/ 06 апреля 2009

Как можно сериализовать подобъекты в $ _SESSION? Вот пример того, что я пытаюсь:

arraytest.php:

<?php

class ArrayTest {
    private $array1 = array();
    public function __construct(){
        $this->array1[] = 'poodle';
    }
    public function getarray(){
        return $this->array1;
    }
}

class DoDoDo {
   public $poop;
   public function __construct(){
        $poop = new ArrayTest();
    }
    public function foo()
    {echo 'bar';}
}

?>

Страница 1:

<?php
require_once('arraytest.php');
session_start();
$bob = new DoDoDo();
$_SESSION['bob'] = serialize($bob);
?>

Страница 2:

<?php
require_once('arraytest.php');
session_start();
$bob = unserialize($_SESSION['bob']);
$bob->foo();
print_r($bob->poop->getarray()); // This generates an error.
?>

Каким-то образом, когда я десериализую объект, экземпляр ArrayTest, назначенный свойству $poop объектов на странице 1, больше не существует, о чем свидетельствует тот факт, что страница 2 генерирует фатальную ошибку в отмеченной строке:

Неустранимая ошибка: вызов функции-члена getarray () для необъекта в строке 6

Ответы [ 2 ]

7 голосов
/ 06 апреля 2009

Ваша проблема не в сериализации. В конструкторе класса dododo есть ошибка. Вы не ссылаетесь на объект класса, а вместо этого ссылаетесь на новую переменную "poop" внутри пространства имен конструктора. Вам не хватает $ this ->.

class dododo{ public $poop; public function __construct(){ $this->poop = new arraytest(); } public function foo() {echo 'bar';} }

С этим изменением все работает.

2 голосов
/ 06 апреля 2009

Это не имеет ничего общего с сериализацией. Это не существует в первую очередь. Вы ошиблись в конструкторе, должно быть:

   public function __construct(){
        $this->poop = new arraytest();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...