如何在Session(Codeigniter)中存储对象

时间:2012-02-19 01:14:25

标签: php codeigniter

情况:似乎无法在CI_Session中存储任何对象,因为在加载模型之前,读取它们会导致PHP_Incomplete_Object异常,因为会话始终启动。 这样,即使自动加载对象类型,我也永远无法从会话中读取数据。

我也尝试使用“原生会话”,但问题完全相同。

此外,我尝试存储序列化的对象,但是在加载所有模型后长时间反序列化时,它仍然成为类型为“__PHP_Incomplete_Class”的对象。

有人知道解决方法吗?请保持“你为什么要在会话中找到一个对象”的答案。看够了......

3 个答案:

答案 0 :(得分:4)

不幸的是,php不允许您将对一个对象的引用序列化。这就是为什么当你恢复你的对象时它不包含它开始的数据。

我提出的最佳解决方案是在我的模型层中创建一个使用cookie恢复的Session对象。数据库中的会话表处理对您原本已序列化的对象的引用。加载会话模型后,您可以使用它来热切地或懒洋洋地加载“会话存储”对象。

此外,如果这些对象持有对其他模型对象的引用,则可以使用相同的原则来遍历模型层的其余部分,具体取决于关系引用。这看起来令人生畏,但是如果您不愿意自己实施它,可以查看一些ORM。

答案 1 :(得分:0)

我发现的另一个选项是您可以以会话数组值的形式存储对象:

您可以这样存储:

$this->session->set_userdata($yourObject);

像这样访问:

$this->session->userdata['property name of your object'];

答案 2 :(得分:0)

到目前为止,我找到的唯一解决方案是将类与控制器一起使用(而不是将其分离为库)。

不是很优雅,但由于某种原因它可以工作,而CI库实例不会。

基本上是这样的:

class Main extends CI_Controller {

    public function index() {           
        $game = new Game(); 
        echo $game->id;
        $this->session->set_userdata('game',$game);
    }

    public function restore_game()  {           
        $game = $this->session->userdata('game');
        echo $game->id;
    }

}

class Game {
    public $id;

    public function __construct() {
        $this->id = rand(0,100);
    }
}

或者您仍然可以将课程保留在'库中。文件夹,但加载经典的require_once而不是$ this-> load->库(' Game'),这是会话无法处理的对象。

require_once(APPPATH . 'libraries/Game.php');

class Main extends CI_Controller {
   ...
}