2015-07-19 83 views
0

我有一些变量用户会话: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数据内还给它也是空的。

+0

时,多少次你叫'的init( )'和'diff()'?确保在第三个函数中不要更改'$ private_startTime'。 – klenium

+0

这可能不是很好的做法,但更好的方法可能是创建一个静态对象,其属性与您的全局变量匹配。 –

+0

当你从你的js运行'check()'时,你的php不会调用'init()',因此'$ private_ *'将会是'null'。如果您发出2个Ajax请求,您的服务器将不记得这些变量。如果你想给它们赋值,你需要每次调用'init()'。或者更改你的代码。或者你可以使用[Memcache](http://php.net/manual/en/book.memcache.php)。 – klenium

回答

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

不,他们不会被重新定义。运行此测试代码,您将看到:

<?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全局,对任一变量的所有引用都将引用全局版本。

0

您可以直接使用$ GLOBALS。 PHP $GLOBALS数组。

+0

[他们是一样的。](http://stackoverflow.com/questions/8035355/what-is-the-difference-between-globals-and-global) – klenium

+0

我有一些与'global'关键字有关的问题。我更喜欢绕过它。当然,从任何地方直接访问全球范围的变量并不是一个好的做法。 – koredalin

+0

问题?什么时候?你能给我一个示例代码吗? – klenium