0

さて、私はこれに対する可能な解決策を見つけました、しかし何らかの理由で、私はそれを私のアプリケーションで動作させることができません。どうやら、名前関数を含む変数がある場合は、次を使用できます

<?php echo $variable(); ?>

同じ名前の関数を出力します。

私はCodeigniterを使用しています。フォームヘルパーには、テキストフィールドを出力する機能があります。

<?php form_input(); ?>

私は変数を持っています

<?php $instance['taxon_field'] = 'form_input'; ?>

この変数をエコーアウトすると、必要な値'form_input'が得られます。しかし、エコーしようとするとすぐに

$instance['taxon_field']()

警告が表示されます:

Message: Illegal string offset 'taxon_field'

と致命的なエラー:

Call to undefined function p()

変数のみをエコーすると「form_input」が得られますが、$ variable()をエコーすると「p」しか得られないため、ここでは本当にわかりません。

どこが間違っているのですか?

4

3 に答える 3

1

ここでの実際の問題は、それ$instanceが配列ではなく文字列であることです。エラー メッセージから判断すると、値が で始まる文字列ですp

この構文$var[$key]は、配列要素にアクセスするためだけでなく、文字列にインデックスを付けるためにも使用されます。ここで、 は文字列$var[0]の最初の文字 (実際にはバイト) になります$var。文字列にインデックスを付けます。これにより、通常の変換ルールに従って結果が得られるため、式全体で文字列の最初の文字が取得されます。$instance$instance['taxon_field']'taxon_field'0

文字列がそれで始まると仮定すると、pその名前で関数を呼び出そうとする理由は明らかです。

于 2012-09-13T22:32:29.987 に答える
1

call_user_func()を使用する

call_user_func($instance['taxon_field']);
于 2012-09-13T22:53:14.667 に答える
0

重要ではないと思ったが重要であることが判明した追加情報を提供できなかったため、作成された混乱は実際には私自身の責任です。私の$instance[]配列は、実際にはforeachループ(正確には2つ)の結果であり、より大きな多次元配列の一部です。実際のコードはもっと複雑ですが、正しく表現しようと思います。

<?php
$bigger_array = array(
    0 => array(
        'field_one' => 'value_one',
        'field_two' => 'value_two',
        'field_three' => 'new_function'
    ),
    1 => array(
        'field_one' => 'new_value_one',
        'field_two' => 'new_value_two',
        'field_three' => 'echo'
    )
);

function new_function()
{
    echo 'New function called.';
}

foreach($bigger_array as $instance)
{
    $name = $instance['field_three'];
    $name('Hello World!');
}
?>

これにより、次のように出力されます。

呼び出された新しい関数。致命的なエラー:69行目の/opt/lampp/htdocs/bla.phpにある未定義の関数echo()を呼び出す

つまり、新しく定義された関数は正常に機能しますが、組み込みの「echo」は機能しません。

これは実際には私の元の問題ではありません。これは、最初の問題をデバッグしようとしたときに発生した問題です。そして、元々の問題は、一次元配列から関数を作成することは問題なく機能するということです。一方、foreachループ内の多次元配列から関数を作成すると、配列は最後のメンバーの値を持つ文字列に変換されます。

今でも質問に完全に答えることはできませんが、提供している情報が解決策につながると思います。ここで示した簡略化された例では、新しい関数が正常に機能しているのに、echo()関数が定義されていないというメッセージが表示されるのはなぜですか?

于 2012-09-14T21:13:40.790 に答える