PHPは、二重引用符で囲まれた文字列での変数補間をサポートしています。たとえば、
$s = "foo $bar";
しかし、関数呼び出しの結果を二重引用符で囲まれた文字列に補間することは可能ですか?
例えば、
$s = "foo {bar()}";
そんな感じ?それは不可能ではないようですよね?
PHPは、二重引用符で囲まれた文字列での変数補間をサポートしています。たとえば、
$s = "foo $bar";
しかし、関数呼び出しの結果を二重引用符で囲まれた文字列に補間することは可能ですか?
例えば、
$s = "foo {bar()}";
そんな感じ?それは不可能ではないようですよね?
Overvの答えが示すように、文字列から関数名への呼び出し手法を使用することは絶対に可能です。多くの些細な置換の場合、次のような代替構文よりもはるかに読みやすくなります。
"<input value='<?php echo 1 + 1 + foo() / bar(); ?>' />"
パーサーは$がそこにあることを期待しているため、変数が必要です。
これは、アイデンティティ変換が構文ハックとしてうまく機能する場所です。恒等関数を宣言し、スコープ内の変数に名前を割り当てるだけです。
function identity($arg){return $arg;}
$interpolate = "identity";
次に、有効なPHP式を関数の引数として渡すことができます。
"<input value='{$interpolate(1 + 1 + foo() / bar() )}' />"
利点は、多くの些細なローカル変数とエコーステートメントを排除できることです。
欠点は、$ interpolate変数がスコープ外になるため、関数とメソッド内でグローバルに繰り返し宣言する必要があることです。
PHPの二重引用符機能は、PHPコードを評価せず、変数をその値に置き換えるだけです。PHPコードを実際に動的に(非常に危険に)評価したい場合は、以下を使用する必要がありますeval
。
eval( "function foo() { bar() }" );
または、関数を作成したいだけの場合:
$foo = create_function( "", "bar()" );
$foo();
これは、他に選択肢がない場合にのみ使用してください。