PHP:变量在使用全局时被重新定义?

时间:2015-07-19 12:51:26

标签: php global-variables

我有一些带有变量的用户会话:

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_startTimecheck($endTime)函数中始终为空。

我的用户会话是否正常工作?因为如果我这样做:

global $private_id;

并在我的json数据中返回它也是null。

3 个答案:

答案 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数组。