PHP在定义函数时是否计算变量?

PHP在定义函数时是否计算变量?,php,Php,我正在使用一个会话在PHP中创建一个多页表单。$stage变量跟踪用户填写表单、更新的进度,通常在表单的每个阶段的$u POST中设置 在第二页第2阶段,表单的submit按钮获得如下值: echo '<input type="hidden" name="stage" value="'; echo $stage + 1; echo '" />; 这很好-如果我在第2页,$stage+1的计算结果为3。但由于我不止一次这样做

我正在使用一个会话在PHP中创建一个多页表单。$stage变量跟踪用户填写表单、更新的进度,通常在表单的每个阶段的$u POST中设置

在第二页第2阶段,表单的submit按钮获得如下值:

echo '<input type="hidden" name="stage" value="';
echo $stage + 1;
echo '" />;
这很好-如果我在第2页,$stage+1的计算结果为3。但由于我不止一次这样做,所以我决定在提到$stage之前,将这段代码拉到一个函数中,我在代码的顶部定义了这个函数

在我以前使用上述代码的地方,我调用了函数。我已经验证了函数的代码是相同的,但是现在$stage+1的计算结果是1

PHP是在定义函数时而不是在调用函数时评估我的变量吗?如果是这样,我该如何防止这种情况

更新1 为了测试这个理论,我在定义函数之前设置$stage=2,但调用函数时它的计算结果仍然是1。发生什么事了

问题解决 感谢所有建议可变范围作为罪魁祸首的人——我现在正在拍我的额头$stage是一个全局变量,我没有像通常那样将其命名为$global_stage,以防止此类问题


我添加了全局$stage;函数定义,它工作良好。谢谢

如果没有更多的代码,这真的很难回答。需要检查的一件事是,在加载下一页之前,您正在将stage保存回会话中。如果stage为null、空或字符串,则stage+1将为1


要调试会话,请将print\u r$\u放入会话;死亡在每页的顶部。

如果没有更多的代码,这真的很难回答。需要检查的一件事是,在加载下一页之前,您正在将stage保存回会话中。如果stage为null、空或字符串,则stage+1将为1


要调试会话,请将print\u r$\u放入会话;死亡在每一页的顶部。

调试代码时,源代码会派上用场


$stage是如何定义或初始化的?函数有自己的变量–函数中定义的变量保留在函数中。除非在函数开头将变量定义为全局变量,否则该变量为全局$foo

调试代码时,源代码会派上用场


$stage是如何定义或初始化的?函数有自己的变量–函数中定义的变量保留在函数中。除非在函数开头将变量定义为全局变量,否则该变量为全局$foo

否,PHP将在调用函数时对变量求值。但是你的函数有一个局部变量,也就是说,如果没有看到你的函数,我猜你是在局部变量上操作的。您可以将全局变量导入到函数中,但不建议这样做:

function myfunction() {
    global $stage;
    ...
}
在不了解代码的情况下很难说,但我继续猜测,在本例中,您使用的是将表单参数注入全局PHP变量$state。您可能想考虑将ReistStGixGOLL关闭,因为它确实是一个安全风险,并使用所谓的变量。 编辑

好的,那么您将在$\u POST数组中看到您的舞台。仍然在疯狂猜测您的函数,您可以尝试以下方法:

function my_insert_stage_param() {
    global $stage;
    echo '<input type="hidden" name="stage" value="';
    echo $_POST['stage'] + 1;
    echo '" />';
}

像$\u POST数组这样的子全局函数不需要用global声明。

否,调用函数时,PHP将对变量求值。但是你的函数有一个局部变量,也就是说,如果没有看到你的函数,我猜你是在局部变量上操作的。您可以将全局变量导入到函数中,但不建议这样做:

function myfunction() {
    global $stage;
    ...
}
在不了解代码的情况下很难说,但我继续猜测,在本例中,您使用的是将表单参数注入全局PHP变量$state。您可能想考虑将ReistStGixGOLL关闭,因为它确实是一个安全风险,并使用所谓的变量。 编辑

好的,那么您将在$\u POST数组中看到您的舞台。仍然在疯狂猜测您的函数,您可以尝试以下方法:

function my_insert_stage_param() {
    global $stage;
    echo '<input type="hidden" name="stage" value="';
    echo $_POST['stage'] + 1;
    echo '" />';
}

像$\u POST数组这样的子erglobal不需要用global声明。

听起来好像遇到了范围问题

试着放:

global $stage;

作为函数的第一行。

听起来好像遇到了范围问题

试着放:

global $stage;

作为函数的第一行。

您确实应该将阶段值作为参数传递给函数,而不是依赖于全局或超全局$\u POST

function formNextStage($stage) {
    return formHidden('stage', $stage + 1);
}

function formHidden($name, $value = '') {
    return sprintf('<input type="hidden" name="%s" value="%s" />', $name, $value);
}
echo formNextStage($stage);
您可以在该函数的基础上构建可选属性,如数组、转义名称/值等

function formHidden($name, $value = '', $attributes = array(), $escape = true)

您确实应该将stage值作为参数传递给函数,而不是依赖于global或superglobal$\u POST

function formNextStage($stage) {
    return formHidden('stage', $stage + 1);
}

function formHidden($name, $value = '') {
    return sprintf('<input type="hidden" name="%s" value="%s" />', $name, $value);
}
echo formNextStage($stage);
您可以在该函数的基础上构建可选属性,如数组、转义名称/值等

function formHidden($name, $value = '', $attributes = array(), $escape = true)

我们真的需要知道$stage在第一个实例中是如何设置的——它是一个POST变量、一个get变量还是一个ses变量
sion变量?请将函数和调用作为代码段发布。我们确实需要知道$stage在第一个实例中是如何设置的-它是一个发布变量、一个get变量、一个会话变量吗?请将函数和调用作为代码段发布。全局范围在请求之间工作,一旦页面完成加载,您的全局变量将是未定义的。在这种情况下,您应该使用sessions。但请注意我对答案的最新补充。因为nerdposeur声称echo$stage+1;在跨页面工作时,我假设他使用的是“register globals”。全局范围在请求之间工作,一旦页面完成加载,您的全局变量将未定义。在这种情况下,您应该使用sessions。但请注意我对答案的最新补充。因为nerdposeur声称echo$stage+1;我猜他在用“全球注册”,我希望我能多投一次赞成票。虽然所有其他的评论都说使用globals实际上是正确的,但它们鼓励了糟糕的编程。我希望我能不止一次地投赞成票。虽然所有其他的评论都说使用globals实际上是正确的,但它们鼓励了糟糕的编程。