Объект класса в сеансе PHP сбрасывается во время работы AJAX?

#php #ajax #class #session #php4

#php #ajax #класс #сеанс #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

Если я импортирую файл класса в remote, он все равно не работает, хотя я могу доказать, что класс загружен.

 <?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. попробуйте отладить его оба раза с помощью var_dump . вы используете старый php4? или почему вы пишете свои классы таким образом. способ php5 заключался бы в том, чтобы иметь function __construct($incoming)

2. Я не очень часто пробую ооп PHP, все еще очень новичок! Значит, я должен просто заменить имя моего конструктора на _construct ?

Ответ №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. 1 Действительно, если класс не загружен, это будет __PHP__Incomplete_Class без свойства dataList.

2. Я внес коррективы точно так же, как указано выше, но все равно получаю count=0

3. @shanethehat Я опубликовал быстрый шаг по устранению неполадок.. что возвращает var_dump?

4. Спасибо, я обновил вопрос с выводом. Это неполный класс, даже после импорта файла класса.

5. Я понял это. Вы должны включить файл класса перед вызовом session_start(). Полагаю, это имеет смысл.