我向您展示了以下简化代码以尝试解释我的问题:
index.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();
?>
class.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
我不明白为什么我第一次点击就失去了储值。
答案 0 :(得分:0)
序列化对象时,PHP仅存储对象的当前状态,即其属性值。它不会序列化其方法。