PHP变量被视为空,除非它被回显

PHP变量被视为空,除非它被回显,php,Php,我在一个名为index.php的页面上定义了一个变量$location,然后在名为loginManager.php的脚本中设置头时使用它。如果我只是使用$location,PHP坚持认为它是空的。但是,如果我在页面上的任何位置回显变量,它将识别变量的内容 以下是相关代码: index.php: $location = $_SERVER['REQUEST_URI']; require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/loginManager.php")

我在一个名为index.php的页面上定义了一个变量$location,然后在名为loginManager.php的脚本中设置头时使用它。如果我只是使用$location,PHP坚持认为它是空的。但是,如果我在页面上的任何位置回显变量,它将识别变量的内容

以下是相关代码:

index.php:

$location = $_SERVER['REQUEST_URI'];
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/loginManager.php");
loginManager.php:

header("Location: http://www.example.com/?location=$location");
echo $location;//Adding this line allows PHP to read the contents of $location.
               //If this line is commented out PHP treats it as if it were empty.
在loginManager.php上运行的代码不在函数或任何会导致$location范围问题的函数中。有人知道PHP为什么会这样做吗

编辑: 当我没有在页面上的某个地方回显$location时,我将详细介绍如何知道PHP认为$location是空的

如果我这样做:

If(empty($location))
    echo "location is empty";
else
    print "location is not empty";
print_r($_REQUEST);
PHP将打印出“位置为空”

但是如果我这样做

echo $location;
If(empty($location))
    echo "location is empty";
else
    print "location is not empty";
PHP将打印出“位置不为空”。我在哪里回显$location似乎并不重要

编辑#2: @jx12345指出,需要回显的不是$location,而是为了读取$location,需要回显一些内容。

尝试添加

global $location;

在loginManager.php顶部附近,如果存在变量作用域问题,则应该处理它。

我认为您的问题可能是重定向循环。我打赌
$\u POST['caller']
是空的,您正在多次重定向到
/
,然后将请求URI设置为空。

这里是否发生了某种奇怪的循环:

index.php加载“/lib/loginManager.php”

将重定向回index.php,其中包含:

header("Location: http://www.example.com/?location=$location");
回声只是打断了重定向

尝试重定向到其他地方,比如test.php

header("Location: http://www.test.co.uk/test.php?location=$location");
里面有一些类似的东西:

If(empty($location))
    echo "location is empty";
else
    print "location is not empty";
print_r($_REQUEST);

查看发生的情况

如果使用标题(“位置:$\u POST[caller]?位置={$\u SERVER['REQUEST\u URI']}”),会发生什么;
var\u dump()
只是为了确定它说了什么?var\u dump($location)给出了:string(16)“/tutoring/tutor/”,这正是$location应该包含的内容。@Tavarius那么为什么不试试类似于
$location=“http://”的东西呢。($\u SERVER['SERVER\u NAME'])。($_SERVER['REQUEST_URI'])
另外,还必须在另一个页面上设置$location,因为它的全部目的是跟踪调用loginManager.php脚本的页面,所以其他建议不起作用。我已经尝试过了,但它不起作用。我真的不认为这是一个范围问题。那也不是。我特别要确保$\u POST['caller']设置在代码中该内容之前。我还可以验证这个特定的报头是否是正在使用的。@OmarJackman如果调用方是空的,OP可能必须添加一个
if
条件。回声的关键是它发生在报头之后,这允许报头仍然通过。hmn true,它不是循环吗,这就是为什么它是空的,因为header(“位置:);没有重定向到header(“位置:);很抱歉给你带来了困惑。原始index.php是www.example.com/test/directory/index.php,loginManager.php重定向到www.example.com/?location=/test/directory/index.php。所以不,它不会自动循环。你能在不同的服务器上试用吗?