我已经制作了一个img编辑器,在99.9%的情况下工作正常。
然而,在那种罕见的0.1%奇怪的事情中,我的会话记得没有正确的值。
我在课程的页面中有这个:
$imgScreen = new img4crop();
// And here some settings like $imgScreen->setExtraJs($extraJs);
在这个类中,我有一个函数将$this
数据保存到数组中:
private function save(){
$_SESSION['cropper'][$this->uniqid] = serialize($this);
}
在init-page.php
中,我打开一个fancybox,将设置重新加载到课程中:
$info = unserialize($_SESSION['cropper'][$_GET['id']]);
// Should now be the same as $imgScreen
问题
有时$_SESSION['cropper'][$_GET['id']]
设置为NULL
。我不知道为什么。 这种情况很少发生。密钥已设置。
当我调试并将echo $_SESSION['cropper'][$this->uniqid];
附加到save()
函数时,它会为我提供我希望它拥有的值。
那么,我的会话值在哪里,只有那个罕见的事件?为什么它不在fancybox屏幕中?
第一条评论后:初始页面可以启动多个实例,它们各自在$_SESSION['cropper']
中获得自己的值。在上面的情况中,它们都有效,只有一个不成功。在重新加载时,我开始新的实例并且完全相同的屏幕不起作用,即使我现在有一个新的,新的id
编辑:它变得更奇怪:如果图像具有与该类名称相同的文件的位置将使用,则没有问题。奇怪的部分:全班没有关于文件的代码,除了最后一步(屏幕有3个步骤),我使用ImageMagick。
重要的是要知道:当我安装发生这种情况的页面时,目标文件也不存在,开始为空。
答案 0 :(得分:0)
在序列化对象时,必须确保在反序列化对象之前加载基类(原型)。对于PHP本机对象,您不必执行任何操作,它将加载基类。
你的变量$ this是一个类的实例。为了使$ this存在,基类需要存在。也许它大部分时间都在工作,因为自动加载器或您正在加载项目的特定顺序。
答案 1 :(得分:0)
事实证明,解决方案是一个与实际代码无关的奇怪的小东西:
在我的index.php中,我$_SESSION['cropper'] = array();
重置数组,然后让显示编辑屏幕的功能为裁剪器设置新设置,这非常合适。
在那个html中,我有一个带有反缓存的图像:
echo '<img src="'.$image_url.'?'.time.'" />';
$image_url
为空/未定义时出现问题,导致源代码如下:?1420793438
。它以?
开头,因此有效地调用index.php?1420793438
。
在index.php
开始时我们重置,结果是一个空数组。