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>";
}
答案 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."); "