我有一些变量用户会话:PHP:使用全局变量时会重新定义变量吗?
if(!isset($_SESSION)) {
session_name('User Session');
session_start();
}
$private_id = session_id();
$private_counter;
$private_max;
$private_startTime;
session_write_close();
,现在我调用初始化函数来初始化这些变量:
function init($counter, $max, $startTime) {
global $private_counter;
global $private_max;
global $private_startTime;
$private_counter = $counter;
$private_max = $max;
$private_startTime = $startTime;
$data = array(
"counter" => $private_counter,
"max" => $private_max,
"startTime" => $private_startTime
);
echo json_encode($data);
}
这将返回例如以下:
counter: 12
max: 20
startTime: 1437309883114
所以我认为变量现在设置,但在另一种方法,我打电话后我做以下事情:
function diff($endTime) {
global $private_startTime;
$diffTime = $endTime - $private_startTime;
$data = array(
"time" => $diffTime
);
echo json_encode($data);
}
而现在$diffTime
始终是$endTime
,因为$private_startTime
为空。但为什么它是空的?我使用函数init($counter, $max, $startTime)
将变量初始化为1437309883114
。当我使用global
陈述时会发生什么?
如果我不允许使用global
,我还能如何访问函数中的用户变量?
编辑
完整的PHP文件:
<?PHP
error_reporting(E_ALL);
ini_set('display_errors', 1);
date_default_timezone_set("Europe/Berlin");
if(isset($_POST["action"]) && !empty($_POST["action"])) {
$action = $_POST["action"];
$startTime;
$endTime;
if(isset($_POST["startTime"]) && !empty($_POST["startTime"])) {
$startTime = $_POST["startTime"];
}
if(isset($_POST["endTime"]) && !empty($_POST["endTime"])) {
$endTime = $_POST["endTime"];
}
switch($action) {
case "init" : init($startTime); break;
case "check" : check($endTime); break;
}
}
if(!isset($_SESSION)) {
session_name('User Session');
session_start();
}
$private_id = session_id();
$private_counter;
$private_max;
$private_startTime;
session_write_close();
/**
*
*
*/
function init($startTime) {
global $private_counter;
global $private_max;
global $private_startTime;
$private_counter = 1;
$private_max = 15;
$private_startTime = $startTime;
$data = array(
"counter" => $private_counter,
"max" => $private_max,
"startTime" => $private_startTime,
);
echo json_encode($data);
}
/**
*
*
*/
function check($endTime) {
global $private_startTime;
$diffTime = $endTime - $private_startTime;
$data = array(
"time" => $diffTime
);
echo json_encode($data);
}
?>
而且JavaScript的文件:
var $ = jQuery;
function init() {
$.ajax({
url: "./myFolder/user.php",
data: {
action: "init",
startTime: new Date().getTime()
},
type: "post",
success: function (output) {
var data = $.parseJSON(output);
var counter = data.counter;
var max = data.max;
var startTime = data.startTime;
console.log("StartTime: " + startTime);
}
});
}
function check() {
$.ajax({
url: "./myFolder/user.php",
data: {
action: "check",
endTime: new Date().getTime()
},
type: "post",
success: function (output) {
var data = $.parseJSON(output);
var time = data.time;
console.log("Time: " + time);
}
});
}
这就是我做的和$private_startTime
总是在php空check($endTime)
功能。
我的用户会话正常工作吗?因为如果我这样做:
global $private_id;
并在我的JSON数据内还给它也是空的。
时,多少次你叫'的init( )'和'diff()'?确保在第三个函数中不要更改'$ private_startTime'。 – klenium
这可能不是很好的做法,但更好的方法可能是创建一个静态对象,其属性与您的全局变量匹配。 –
当你从你的js运行'check()'时,你的php不会调用'init()',因此'$ private_ *'将会是'null'。如果您发出2个Ajax请求,您的服务器将不记得这些变量。如果你想给它们赋值,你需要每次调用'init()'。或者更改你的代码。或者你可以使用[Memcache](http://php.net/manual/en/book.memcache.php)。 – klenium