首页 > 解决方案 > 对象序列化问题

问题描述

我向您展示以下简化代码以尝试解释我的问题:

索引.php

<?php
session_start();
include ('class.php');
$a =  new A();
$_SESSION['serializedClass'] = serialize($a);
?>
<div id="result"></div><br><br><input type="button" id="btn" value="populate div">
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
<script>
$( document ).ready(function() {
$( "#btn" ).click(function() {  
$.ajax({
        url: 'ajax.php',
        dataType: "html",
        success: function (data) {  
                                   $('#result').html(data);
                                 }

      });
});
});
</script>

ajax.php

<?php
session_start();
include ('class.php');
$a = unserialize($_SESSION['serializedClass']);
print $a->managestr();
?>   

类.php:

class A
{ 
    public $startProcess;
    public $strCreated = false;
    public $str;
    public function __construct()
    {  
        $this->startProcess = time();
    }
    public function setstr($currStr)
    {    
        if (!$this->strCreated) $this->strCreated = true;
        $this -> str = 'Start process at '.$this->startProcess.': '.$currStr;

    }
    public function managestr()
    {
      if ($this->strCreated) return $this->str; 
      $currStr = 'here at '.time();
      if (!$this->strCreated) $this->setstr($currStr);
      return $this -> str;              
    }
} 

index.php页面中,我序列化了类的实例并将其存储在一个SESSION变量中,以便在每个 ajax 调用中重用相同的实例。

我期望,当我单击“填充 div”按钮时,会看到如下结果:

第一次点击: Start process 1577113743: here at 1577113743

第二次点击: Start process 1577113743: here at 1577113743

即第一次单击后的结果相同,因为我总是将值存储在 中$this -> str,事实上,如果它被创建,我应该得到存储的值。

实际上,当我第二次或更多次单击时,我看到:

Start process 1577113743: here at 1577113744
Start process 1577113743: here at 1577113745, etc

我不明白为什么我在第一次点击时丢失了储值。

标签: javascriptphpjqueryajax

解决方案


当序列化一个对象时,PHP 只存储对象的当前状态,即它的属性值。它不序列化它的方法。


推荐阅读