2

に問題があり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 )
    {
      ...
    }

array を除いて、すべてが完全に機能し$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>";
}
4

3 に答える 3

2

'ed 文字列で関数a()を実行している場合、変数はもう存在しません。これによりエラーが発生し、エラーが発生します。eval$areval()

を使用しているのでeval()、それを修正する手っ取り早いハックな方法が適切なようです。;-)

これを行う代わりに:

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

あなたはこれを行うことができます:

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

これにより、文字列 $run は次のようになりますecho

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

したがって、変数を渡す代わりに、配列を関数呼び出しに直接渡しています。

于 2012-09-25T08:46:18.110 に答える
0

はい、次のように変更$arParamsします。

$arParams = 'array("pluginid" => "monitor", "title" => "Monitor", ...)';
于 2012-09-24T15:30:08.490 に答える
0

私は今、このハックを使用しています:

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

// later on
... => " openForm(desktop(),'".$strId."','".$strClass."',".$strParams."); "
于 2012-09-25T08:44:55.120 に答える