带有AJAX调用的php变量范围

时间:2011-08-17 19:25:23

标签: php javascript jquery ajax

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 个答案:

答案 0 :(得分:2)

您需要在json页面上重新创建$test

<?php
      require_once 'test.php';
      $test = new Test('some parameter');
      echo json_encode($test->SomeFunction());
?>

答案 1 :(得分:2)

您可以session_start()并将$test放入$_SESSION['whatever']

对于两个HTTP请求,您需要session_start()作为php活动中的第一件事。在第二个HTTP请求中,只需json_decode()对象,然后将其添加到$_SESSION['whatever']

如果您不熟悉会话,它们基本上可以让您保留状态,在$_SESSION[]中存储状态数据。见这里:http://www.php.net/manual/en/function.session-start.php

答案 2 :(得分:1)

这是对PHP的两个单独调用:第一个是您的加载页面(main.php),第二个是在ajax调用(start.php)中。因此,您需要在start.php中再次要求/ include test.php。

答案 3 :(得分:1)

在第一次请求时将其添加到会话

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

并在start.php中

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

并将其打印到repsponse

答案 4 :(得分:0)

从服务器请求

main.php。评估并执行所有服务器端代码,并发送响应。此时,脚本已完成。

之后的一段时间,AJAX请求会命中服务器。这是一个完全独立的请求,重新创建课程“测试”所需的任何数据都需要与GET中的请求一起发送,或者设置在SESSION中。

答案 5 :(得分:0)

当您发出ajax请求时,您正在启动一个新的PHP请求,因此除非通过JSON明确传递,否则一个中的变量都不会在另一个中可用。您可以将它存储在会话中,或者您可以将“some parameter”字符串传递给请求的脚本并在那里构造Test对象。

答案 6 :(得分:0)

HTTP是一种无状态协议,一切都在请求之间从头开始。

您通常不会在会话中放置对象,因为它可能会导致意外行为。您应该在start.php中重新验证Test。

如果Test需要保留状态(某些变量的值),则应该将该状态分解并将其存储在会话中。

答案 7 :(得分:0)

main.php中,$test是一个全局变量,它将一直存在,直到PHP完成执行。当浏览器显示页面时,表示PHP已完成执行。

当您对start.php进行AJAX调用时,PHP会再次启动,除非您包含main.php,否则它不知道$test

您需要在$test上重新声明start.php,或在另一个文件中声明,并将其包含在main.phpstart.php中。