【问题标题】:PHP: How to reset a global variable before each use in function containing eval()PHP:如何在每次使用包含 eval() 的函数之前重置全局变量
【发布时间】:2012-07-29 07:38:20
【问题描述】:

我在网站中有以下代码。

$magic_number_output = 'The magic number is: $magic_number';

function show_magic_number($magic_number) {
  global $magic_number_output;

  eval("\$magic_number_output = \"$magic_number_output\";");

  echo '
  ' . $magic_number_output;

}

变量$magic_number_output 被设置在一个单独的 PHP 文件中,然后在一个函数中使用 global 引用,因为对于不同的语言,这个变量会有不同的版本。 $magic_number 被传递到函数中,并使用 eval() 在变量中替换。但是,当多次调用该函数时,$magic_number 不会从发送给该函数的第一个值更改。例如,如果这样调用:

show_magic_number(5);
show_magic_number(2000);

...输出是这样的:

幻数是:5
神奇的数字是:5

...当我希望它是这样的时候:

幻数是:5
神奇的数字是:2000

很明显,我误解了globaleval() 的工作原理,并尝试寻找答案并进行试验,但我实在是太菜鸟了,无法找到解决方案。我认为可能有某种方法可以每次都重置全局变量,这样它就不会继续引用第一次发送给函数的$magic_number(即5)。

任何人都可以提出解决这个问题的方法吗?

【问题讨论】:

  • 你为什么要这样做?为什么不直接在函数内部设置 $magic_number_output?
  • 正如解释的那样,变量 $magic_number_output 被设置在一个单独的 PHP 文件中,因为对于不同的语言会有不同的版本。每种语言使用一个文件来包含整个网站使用的字符串。
  • 顺便说一句,你真的应该考虑不要使用eval(),因为它非常糟糕和邪恶。在你的情况下,它似乎过于复杂......
  • 你能推荐一个替代方案吗?我承认当用户输入通过时 eval() 是不安全的,但在这种情况下,只有我自己的代码设置的值才会传递给它。
  • 魔法?全球的?评估?我走了!

标签: php function global-variables eval global


【解决方案1】:

试试这个。它至少会摆脱eval()

$magic_number_output = 'The magic number is: $magic_number';

function show_magic_number($magic_number) {
  global $magic_number_output;

  $output=$magic_number_output;
  echo str_replace('$magic_number',$magic_number,$output);
}

【讨论】:

  • 谢谢;这很棒。如此简单,它就完成了这项工作。
【解决方案2】:

不要用eval,看看sprintf函数:

$magic_number_output = 'The magic number is: %d';

function show_magic_number($magic_number) {
  global $magic_number_output;
  echo sprintf($magic_number_output, $magic_number);
}

【讨论】:

  • 不,sprintf 不好,eval 更好,它使代码更加动态
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多