我有一些带有变量的用户会话:
if(!isset($_SESSION)) {
session_name('User Session');
session_start();
}
$private_id = session_id();
$private_counter;
$private_max;
$private_startTime;
session_write_close();
现在我调用init函数来初始化这些变量:
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
为空。但为什么它是空的?我使用函数1437309883114
使用init($counter, $max, $startTime)
初始化变量。当我使用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-File:
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
在check($endTime)
函数中始终为空。
我的用户会话是否正常工作?因为如果我这样做:
global $private_id;
并在我的json数据中返回它也是null。
答案 0 :(得分:2)
全局变量不会在请求中持续存在,您应该使用会话,并使用$_SESSION
访问和修改会话变量:
function init($startTime)
{
$_SESSION['private_counter'] = 1;
$_SESSION['private_max'] = 15;
$_SESSION['private_startTime'] = $startTime;
$data = array(
"counter" => $_SESSION['private_counter'],
"max" => $_SESSION['private_max'],
"startTime" => $_SESSION['private_startTime'],
);
echo json_encode($data);
}
function check($endTime)
{
$diffTime = $endTime - $_SESSION['private_startTime'];
$data = array(
"time" => $diffTime
);
echo json_encode($data);
}
答案 1 :(得分:1)
不,他们不会被重新定义。运行此测试代码,您将看到:
<?php
function diff() {
global $private_startTime;
var_dump($private_startTime);
}
function init($startTime) {
global $private_startTime;
$private_startTime = $startTime;
var_dump($private_startTime);
}
$private_startTime = 0;
init(1437309883114);
diff();
var_dump($private_startTime);
?>
它打印1437309883114 3次。问题在于您的代码,我们无法看到。 global
关键字不会影响变量的值。来自documentation:
通过在函数中声明$ a和$ b global,对任一变量的所有引用都将引用全局版本。
答案 2 :(得分:0)
您可以直接使用$ GLOBALS。 PHP $GLOBALS数组。