Сохранить массив в строке для 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>"; } с $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>"; } с $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>"; } 

Когда вы выполняете функцию a() в вашей переменной eval , переменная $ar больше не существует. Это вызывает ошибку, которая приводит к ошибке eval() .

Поскольку вы используете eval() , быстрый и грязный хакерский способ исправить это кажется уместным. 😉

Вместо этого:

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

Вы можете сделать это:

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

Это приведет к тому, что строка $ run будет выглядеть так, если вы хотите ее echo :

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

Итак, теперь вы передаете массив непосредственно в вызов функции, а не передаете переменную.

Да, измените $arParams на это:

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

Теперь я использую этот хак:

 $strParams = " array("; foreach($arParams as $strKey => $strVal) { $strParams .= "'".$strKey."' => '".$strVal."',"; } $strParams = substr($strParams, 0, -1) . ") "; // later on ... => " openForm(desktop(),'".$strId."','".$strClass."',".$strParams."); "