Возникли проблемы с 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."); "