【问题标题】:Global variables getting reset in PHP全局变量在 PHP 中被重置
【发布时间】:2017-01-29 09:49:40
【问题描述】:

我有一个包含 3 个(相关)全局变量的脚本,用于跟踪检查用户数据时发生的错误。处理它们的函数如下所示:

$errors = '';
$errorNo = 0;
$erred = false;

function addError($errorMessage) {
    global $errors, $errorNo, $erred;
    if (!$erred) {
        $erred = true;
    }
    $errorNo++;
    $errors .= $errorNo . ". " . $errorMessage;
}

假设我不止一次调用addError()$errors 的值将是'',即使它刚刚被addError() 函数修改。不仅如此,变量$errorNo$erred 也被重置为我最初初始化它们时使用的值。

我彻底检查了我的代码,以查看 $error 或其他变量是否在其他地方被修改但无济于事。

现在,情况变得更奇怪了。为了确保它们没有被其他任何东西修改(我有一个使用 require() 导入的外部库),我创建了一个名为 errorHandler 的类。

class errorHandler {
    private $errorCount = 0;
    private $erred = false;
    private $errors = '';

    public function addError($errorMessage) {
        $this->erred = true;
        $this->errorCount++;
        $this->errors .= $this->errorCount . ". " . $errorMessage;
    }

    public function getErrors() {
        return $this->errors;
    }
}

函数完成后不会存储$errors$errorCount$erred 的值。如果我在函数内回显该值,它将是我刚刚分配给它的值,但是如果我在分配之前回显它,它将是它初始化时的值。

任何想法可能是问题所在?谢谢。

编辑:

errorHandler 类的用法如下:

$errorHandler = new errorHandler; // Earlier in code

function addError($errorMessage) { // Function has name to avoid renaming
    global $errorHandler;
    $errorHandler->addError($errorMessage);
}

【问题讨论】:

  • 你能分享一个正在使用的类的例子吗? (与您的调试)
  • 如果你指的是外部库:getid3.sourceforge.net
  • 我的意思是你写的“errorHandler”函数的用法。
  • 您不尝试在单独的(http/page)请求中访问这些值吗?
  • Global 表示它们存在于当前运行脚本的全局范围内。它们在再次运行脚本时重新初始化(通过新页面请求)。如果您想保留重新执行的值,请将值存储在会话中或传递它们。

标签: php variables reset


【解决方案1】:

问题原来是不是变量被重置(如您所料),但是,这是一个错误,我希望其他人可以从中吸取教训。

基本上我在 if 语句中有一个函数 checkLength(),如下所示:

if (checkLength($stringOne) && checkLength($stringTwo) && checkLength($stringThree)) {

checkLength 语句会检查字符串的长度,如果太短或太长则返回 false,但在此之前会使用 addError() 函数添加错误:

function checkLength($string) {
    if (..
    ..
    else {
        addError("Too short/long");
        return false;
    }
}

我没有意识到,只要 if 语句有 一个错误值(因为我有 && 运算符),它就会在第二个或第三个字符串,因此没有添加错误,让我相信只有一个错误被记录。

这里的教训:尽可能将函数的返回值存储在变量中,然后检查变量的值而不是函数的返回值。还是谢谢。

【讨论】:

  • 这就是为什么你被要求提供代码而不是描述它的原因。
【解决方案2】:

每次发出 POST 请求时,都会再次处理 PHP 文件,这意味着代码从头开始运行。因此,变量的值每次都会重置。

为了解决这个问题,您可以在 javascript 文件中维护全局变量,并且每次从 javascript 文件调用此函数时,更改 js 文件中变量的值。每次发出请求时,这些值都不会改变。

【讨论】:

  • 您对失败的原因是正确的,并且您的修复将起作用。尽管您也可以使用 JSON、CSV 或其他文件类型。考虑到这个文件只是为了让 PHP 脚本可以记住以前运行的值,使用 PHP 可以本地读取的文件类型会更轻松。因为您必须以特殊的方式格式化文件以供 JavaScript 读取,而且它不是 PHP 读取的本机格式,因此您需要自定义写入和读取函数,而不是使用 JSON 或 CSV 构建在函数中读取/写入数据到这些文件类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
相关资源
最近更新 更多