AJAX操作期间PHP会话中的类对象重置?

时间:2011-06-09 14:02:13

标签: php ajax class session php4

我有一个简单的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']);
?>

第一个文件上的回显显示2,成功功能中的警报显示“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”。任何人都可以解释为什么会这样吗?

UPDATE1

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

<?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

UPDATE2

的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"
    }
}

1 个答案:

答案 0 :(得分:6)

您需要将该类包含在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);
        }
    }
?>