3

以前、配列インデックスを変数名として使用しようとするトピックを作成しましたが、ここで興味深い回答を 1 つ受け取りました。

回答の 1 つは eval() の使用を提案しましたが、潜在的なセキュリティ上の問題のために推奨されませんでした。

$string = 'welcome["hello"]';
eval('$' . $string . " = 'thisworks';");

// This also works : eval("$$string = 'thisworks';");

// I could then print the array keys value like this
print( $welcome["hello"] ); // Prints 'thisworks'

ただし、このソリューションは最も単純であり、おそらく私が達成したいことに最も適しています。私は実際にWordpressの管理パネルに取り組んでおり、ユーザーが設定できるさまざまなオプションが満載です。各オプションは、次のように多次元配列を含む変数を介して設定されます (はるかに大きいだけです)。

$options = array(
 array(
  'id' => 'option_id', // The name of the input field
  'type' => 'text', // Input type
  'value' => 'some value here' // Input value
 )
);

ユーザーがオプションを保存すると、関数が起動し、さまざまな入力値すべてから配列が作成され、データベースに保存されます。以下のように、非常に簡素化されていますが:

foreach ( $options as $o ) {
 if ( isset( $_POST[ $o[ 'id' ] ] ) ) {
  $settings[ $o[ 'id' ] ] = $_POST[ $o[ 'id' ] ];
 }
}

多次元オプション変数のオプションの一部は、文字列ではなく配列の一部として保存されます。これらのオプションには、'option_id[value1]' のように、ID に角括弧が含まれています。

これは、物事が複雑になるところです。現在、角かっこ [] をチェックする関数を介して ID を送信し、それを適切に処理する方法 (配列または文字列として保存) を保存関数に指示する必要があります。

これが、eval ソリューションが理想的な理由です。これにより、他の関数を使用して ID を分析することなく、既に配列であり、インデックスを含む変数を作成できます。それは、長く曲がりくねったプロセスを大幅に削減するか、そう信じています。

つまり、本質的に、eval を使用したり、代替機能を使用したりできる、より安全で同様の方法はありますか。上記の方法で eval を使用することの危険性は何ですか? 上記のコンテキストで悪意のあるコードを実行できますか? $ の前にコードを実行すると、PHP エラーが発生するのでしょうか?

4

1 に答える 1

3

このように eval を使用することは、私にはハックのように思え、パフォーマンスが向上する可能性は低いです。可変変数を使用して同じことを達成してみませんか?

$string = 'welcome';
$key = "hello";

${$string}[$key] = "this works better";
print( $welcome["hello"] ); // Prints 'this works better'
于 2012-05-13T16:20:30.770 に答える