php - Eval 和数组索引作为变量

标签 php eval

我之前做过一个关于尝试使用数组索引作为变量名的话题,并收到了一个让我感兴趣的答案 here .

其中一个答案建议使用 eval(),但由于其潜在的安全问题而未推荐。

$string = 'welcome["hello"]';
eval('$' . $string . " = 'thisworks';");

// This also works : eval("$$string = 'thisworks';");

// I could then print the array keys value like this
print( $welcome["hello"] ); // Prints 'thisworks'

但是,这个解决方案是最简单的,并且可能最适合我想要实现的目标。我实际上正在开发一个 Wordpress 管理面板,其中包含用户可以设置的各种选项。每个选项都是通过一个包含多维数组的变量来设置的,就像这样(只是更大):

$options = array(
 array(
  'id' => 'option_id', // The name of the input field
  'type' => 'text', // Input type
  'value' => 'some value here' // Input value
 )
);

当用户保存选项时,将触发一个函数,从所有不同的输入值中创建一个数组并将它们保存到数据库中。如下所示,虽然高度精简:

foreach ( $options as $o ) {
 if ( isset( $_POST[ $o[ 'id' ] ] ) ) {
  $settings[ $o[ 'id' ] ] = $_POST[ $o[ 'id' ] ];
 }
}

多维选项变量中的一些选项将保存为数组的一部分,而不是字符串。这些选项在其 ID 中包含方括号,例如“option_id[value1]”。

这就是事情变得复杂的地方。目前,我必须通过检查方括号 [] 的函数发送 ID,然后告诉保存函数如何适本地处理它(保存为数组或字符串)。

这就是 eval 解决方案非常理想的原因。它允许我创建一个已经是数组并包含索引的变量,而无需使用其他函数来解析 ID。它大大减少了冗长的过程,我相信是这样。

所以从本质上讲,有没有一种更安全、类似的方法可以让我使用 eval 或使用替代功能。上述方式使用eval有什么危险?恶意代码可以在上面使用的上下文中执行吗?在 $ 之前执行代码肯定会导致 PHP 错误吗?

最佳答案

以这种方式使用 eval 对我来说似乎是一种 hack,不太可能是高性能的。为什么不使用可变变量来实现同样的事情呢?

$string = 'welcome';
$key = "hello";

${$string}[$key] = "this works better";
print( $welcome["hello"] ); // Prints 'this works better'

关于php - Eval 和数组索引作为变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10567199/

相关文章:

php - 调用未定义的函数错误,即使函数已定义

clojure - 我可以不使用 eval 来编写这个宏吗?

javascript - eval 调用函数,函数又调用定义函数的 eval

lisp - Common Lisp 中的可参数化返回

php - Symfony 1.4 - 在 get 请求中传递 URL

php - MYSQL 按日期分组 + 3 小时

php - 使用 root :root instead of webapp:webapp 创建的 Laravel 日志文件

php - 使用 Web 数据库应用程序的常用函数和 View

javascript - 为什么 eval() 中的 typeof 在我的函数中抛出错误?

javascript - 为什么 Node.js 中非交互式 Function 对象内的上下文不同?