Область видимости переменной php с вызовами AJAX - PullRequest
1 голос
/ 17 августа 2011

Какое значение имеют переменные php в отношении вызовов AJAX? Так, например, файл main.php создает экземпляр класса Test:

<html>
  <head>
    <?php
      require_once 'test.php';
      $test = new Test('some parameter');
    ?>
  </head>
  <body></body>

</html>

Позже происходит событие jQuery post, вызванное некоторым событием:

$(document).ready(function() {

  $.post(   
    "class/start.php",   
    function(data) {
      // some functioning.              
    }, "json");

});

Затем в start.php мне нужен доступ к классу, который я определил в main.php. E.g.:

<?php
  echo json_encode($test->SomeFunction());
?>

Из тестирования я уверен, что это невозможно. Я предполагаю, что область действия $test умирает, когда main.php приходит с сервера. Итак, что мне нужно сделать, чтобы получить доступ к экземпляру этого класса? Нужно ли добавлять $test в качестве переменной сеанса или есть какой-то другой лучший способ?

Ответы [ 8 ]

2 голосов
/ 17 августа 2011

Вы можете session_start() и положить $test в $_SESSION['whatever'].

Вам нужно будет session_start() как первое действие в php для обоих HTTP-запросов. Во втором HTTP-запросе просто json_decode() объект и затем добавьте его к $_SESSION['whatever'].

Если вы не знакомы с сессиями, они в основном дают вам возможность сохранять состояние, сохраняя данные о состоянии в $_SESSION[]. Смотрите здесь: http://www.php.net/manual/en/function.session-start.php

2 голосов
/ 17 августа 2011

Вам необходимо воссоздать $test на странице json:

<?php
      require_once 'test.php';
      $test = new Test('some parameter');
      echo json_encode($test->SomeFunction());
?>
1 голос
/ 17 августа 2011

добавить его в сеанс по первому запросу

$_SESSION['test'] = serialize($test);

и в start.php

$test = isset($_SESSION['test']) ? unserialize($_SESSION['test']) : 'no test';

и распечатайте для ответа

1 голос
/ 17 августа 2011

Это два отдельных вызова PHP: первый - это страница загрузки (main.php), а второй - вызов ajax (start.php). Поэтому вам нужно снова включить / включить test.php в свой файл start.php.

0 голосов
/ 17 августа 2011

В main.php, $test - глобальная переменная, которая будет существовать до тех пор, пока не завершится выполнение PHP.Когда браузер показывает страницу, это означает, что PHP завершил выполнение.

Когда вы делаете AJAX-вызов на start.php, PHP запускается снова, и если вы не включите main.php, он не имеет представления о $test.

Вам необходимо повторно объявить $test в start.php или объявить его в другом файле и включить его в main.php и start.php.

0 голосов
/ 17 августа 2011

HTTP - это протокол без сохранения состояния, все начинается с нуля между запросами.

Обычно вы не помещаете объекты в сеансы, так как это может привести к неожиданному поведению. Вместо этого вам следует заново создать Test в файле start.php.

Если Test необходимо сохранить состояние (значения некоторых переменных), вы должны разбить это состояние и сохранить его в отдельном сеансе.

0 голосов
/ 17 августа 2011

когда вы делаете ajax-запрос, вы запускаете новый PHP-запрос, поэтому ни одна из переменных в одной из них не будет доступна в другой, если не передается через JSON. Вы можете сохранить его в сеансе или передать строку «некоторый параметр» запрошенному сценарию и создать там объект Test.

0 голосов
/ 17 августа 2011

main.php запрашивается с сервера.Весь код на стороне сервера оценивается и выполняется, и отправляется ответ.На этом этапе сценарий завершен.

Через некоторое время запрос AJAX попадает на сервер.Это совершенно отдельный запрос, и любые данные, которые вам нужны для воссоздания класса 'test', должны быть отправлены вместе с запросом в GET или заданы в SESSION.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...