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
添加为会话变量,还是有其他更好的方式?
答案 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.php
和start.php
中。