javascript - 对象序列化问题
问题描述
我向您展示以下简化代码以尝试解释我的问题:
索引.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
我不明白为什么我在第一次点击时丢失了储值。
解决方案
当序列化一个对象时,PHP 只存储对象的当前状态,即它的属性值。它不序列化它的方法。
推荐阅读
- javascript - 检查一组集合中的重复项的更有效方法是什么
- r - 在R中的每一列中填充矩阵的更简单方法
- python - 在多维数组上计算自定义函数的快速方法?
- javascript - 如何使用 PHP 从 MySQL 数据库中填充谷歌可视化数据表?
- c++ - 在 cpp 中的工厂方法的情况下,继承如何工作?
- c++ - 如何从 C++ 标准中推断出数组 [] 的优先级高于指针?
- scala - Scala Play Rest 服务在路由文件中找不到控制器 [Play 2.6, Scala]
- python-3.x - TensorFlow 2 命令“python object_detection/builders/model_builder_tf2_test.py”在 Anaconda 环境中为 TensorFlow 1 而不是 TensorFlow 2 运行
- c# - 如何在任务进行时从长时间运行的任务中返回对象?
- github - 来自私有 github 仓库的依赖