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