对象序列化探针

时间:2019-12-23 15:28:25

标签: javascript php jquery ajax

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

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

我不明白为什么我第一次点击就失去了储值。

1 个答案:

答案 0 :(得分:0)

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