Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP object serialization and Sessions

Tags:

php

session

How is it possible to serialize sub-objects to $_SESSION? Here is an example of what I'm trying:

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';}
}

?>

Page 1:

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

Page 2:

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

Somehow when I deserialize the object, the ArrayTest instance assigned to the objects's $poop property in page 1 doesn't exist any more, as evidenced by the fact that page 2 generates a fatal error on the marked line:

Fatal error: Call to a member function getarray() on a non-object in on line 6

like image 426
Olivier Tremblay Avatar asked Jan 23 '23 17:01

Olivier Tremblay


2 Answers

Your problem isn't serialization. Class dododo's constructor has a bug. You aren't referencing the class object, but instead are referring to a new variable "poop" inside of the constructor's namespace. You're missing a $this->.

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

It works fine with this change.

like image 164
Frank Crook Avatar answered Jan 26 '23 06:01

Frank Crook


It has got nothing to do with serialization. It doesn't exist in the first place. You've got it wrong in the constructor, should be:

   public function __construct(){
        $this->poop = new arraytest();
    }
like image 29
vartec Avatar answered Jan 26 '23 05:01

vartec