我也尝试使用“原生会话”,但问题完全相同。
此外,我尝试存储序列化的对象,但是在加载所有模型后长时间反序列化时,它仍然成为类型为“__PHP_Incomplete_Class”的对象。
有人知道解决方法吗?请保持“你为什么要在会话中找到一个对象”的答案。看够了......
答案 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 {
...
}