稍后将字符串中的数组存储到eval()

时间:2012-09-24 15:25:55

标签: php arrays eval

eval()出现问题。我被迫将字符串存储在稍后将被执行的数组中。

现在,在字符串中存储字符串没有问题。但是如何在那里存储数组呢?由于我无法访问变量,因此我希望将数组直接存储到此字符串中。

请参阅此代码:

    // ----------------------
    // -- class A
    $strId    = 'id_1234';
    $strClass = 'classname';
    $arParams = array('pluginid' => 'monitor', 'title' => 'Monitor', ...);

    $strClone = 'openForm(desktop(),"'.$strId.'","'.$strClass.'",'.$arParams.');';

    $this->menu = array( "clone" => $strClone, ... );

    // ----------------------
    // -- class B
    // loop through $this->menu, then..
    {
      eval( $this->menu[$item] );
    }

    // ----------------------
    // -- class C
    function openForm( $owner, $id, $class, $params )
    {
      ...
    }

除了数组$arParams之外,一切都很完美。

There is an error: PHP Parse error: syntax error, unexpected ')', expecting '(' in ... (441) : eval()'d code on line 1

有什么问题? 我可以在没有serialize()的情况下执行此操作吗?


修改

我已经确定了正在发生的事情。如果你运行它,那么它是固定的:

$ar = array('a' => 'value1', 'b' => 'value2');
$str = "something";

$run = " a('".$str."', \$ar); "; // this line may be changed

// this is done to represent the loss of the variables in another class
unset($ar);
unset($str);

// $run is kept
eval( $run );

function a($str, $ar) {
    echo "\$str="         . $str      . "<br>";
    echo "\$ar['a']="     . $ar['a']    . "<br>";
    echo "\$ar['b']="     . $ar['b']    . "<br>";
}

3 个答案:

答案 0 :(得分:2)

当您在a()'ed字符串中运行函数eval时,变量$ar不再存在。这会触发错误,导致eval()失败。

由于您正在使用eval(),因此修复它的快速而肮脏的方式似乎是合适的。 ; - )

而不是这样做:

$run = " a('".$str."', \$ar); ";

你可以这样做:

$run = " a('$str', ". var_export($ar, true) ."); ";

这会导致字符串$ run看起来像这样echo

a('something', array(
  'a' => 'value1',
  'b' => 'value2',
));

所以现在你将数组直接传递给函数调用,而不是传递变量。

答案 1 :(得分:0)

是的,将$arParams更改为:

$arParams = 'array("pluginid" => "monitor", "title" => "Monitor", ...)';

答案 2 :(得分:0)

我现在使用这个黑客:

$strParams = " array(";
foreach($arParams as $strKey => $strVal) {
   $strParams .= "'".$strKey."' => '".$strVal."',";
}
$strParams = substr($strParams, 0, -1) . ") ";

// later on
... => " openForm(desktop(),'".$strId."','".$strClass."',".$strParams."); "