【问题标题】:Class Object in PHP session reset during AJAX operation?AJAX操作期间PHP会话中的类对象重置?
【发布时间】:2011-09-11 17:57:34
【问题描述】:

我有一个简单的 PHP 会话和 AJAX 示例,在会话中保存数组时可以使用:

请求文件:

<?php
    session_start();
    $_SESSION['data'] = array('foo','bar');
    echo count($_SESSION['data']);
?>
<html>
<head>
    <title>Test</title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
</head>
<body>
    <button id="but1">Go</button>
    <script type="text/javascript">
        $('#but1').click(function() {
            $.ajax({
                url:'ajaxtest_remote.php',
                success:function(result) {
                    alert(result);
                }
            });
        });
    </script>
</body>
</html>

远程文件:

<?php
    session_start();
    echo 'count=' . count($_SESSION['data']);
?>

第一个文件的 echo 显示 2,success 函数中的 alert 显示“count=2”。快乐的日子。

问题发生的地方是如果我将数组换成类对象:

请求文件:

<?php
    session_start();
    include('ajaxtest_class.php');
    $_SESSION['obj'] = new TestClass('foo,bar');
    echo count($_SESSION['obj']->dataList);
?>
<!-- HMTL AS ABOVE -->

远程文件:

<?php
    session_start();
    echo 'count=' . count($_SESSION['obj']->dataList);
?>

类文件:

<?php
    class TestClass {
        var $dataList;
        function TestClass($incoming) {
            $this->dataList = explode(',',$incoming);
        }
    }
?>

这仍然在第一页上显示 2,但 ajax 成功警报返回“count=0”。谁能解释这是为什么?

更新1

如果我将类文件导入远程,它仍然不起作用,尽管我可以证明类已加载。

<?php
    session_start();
    include('ajaxtest_class.php');
    $c = new TestClass('a,b,c');
    echo 'count=' . count($_SESSION['obj']->dataList) . '-' . count($c->dataList);
?>

来自 ajax 成功的新警报显示为 count=0-3

更新2

var_dump($_SESSION['obj']);

object(__PHP_Incomplete_Class)#8 (2) {
    ["__PHP_Incomplete_Class_Name"]=>
    string(9) "TestClass"
    ["dataList"]=>
    array(2) {
        [0]=>
        string(3) "foo"
        [1]=>
        string(3) "bar"
    }
}

【问题讨论】:

  • 尝试使用var_dump 调试它两次。你在旧的 php4 上吗?或者你为什么要这样写你的课程。 php5 的方式是有一个function __construct($incoming)
  • 我不经常尝试oop PHP,还是个新手!所以我应该用_construct替换我的构造函数的名称?

标签: php ajax class session php4


【解决方案1】:

您需要在 remote_ajax 文件中包含该类(session_start() 之前):

编辑:序列化/反序列化要求是 PHP4 的限制。

请求文件:

<?php
include('ajaxtest_class.php');
session_start();
$_SESSION['obj'] = serialize(new TestClass('foo,bar'));

远程文件:

<?php
    session_start();
    include('ajaxtest_class.php');
    $obj = unserialize($_SESSION['obj']);
    echo 'count=' . count($obj->dataList);
?>

在 PHP 中,类构造函数的定义应该不同:

<?php
    class TestClass {
        var $dataList;
        function __construct($incoming) {
            $this->dataList = explode(',',$incoming);
        }
    }
?>

【讨论】:

  • +1 事实上,除非类被加载,否则它将是一个没有 dataList 属性的 __PHP_Incomplete_Class。
  • 我已经按照上面的方式进行了调整,但仍然得到count=0
  • @shanethehat 我发布了一个快速故障排除步骤.. var_dump 返回什么?
  • 谢谢,我已经用输出更新了问题。它是一个不完整的类,即使在导入类文件之后也是如此。
  • 我想通了。您必须在调用 session_start() 之前包含类文件。我想是有道理的。
猜你喜欢
  • 2015-08-18
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多