3

私は以前にこのような質問をしましたが、これは異なります。これはロジックの解析に関するものです。

以前の質問は、文字列(二重引用符で囲まれた)内に関数を埋め込む方法についてでしたが、次の回答を受け取りました。

$date = "date";
echo "This page is under construction<br/><br/>Current Date: {$date('l jS \of F Y')}";

そしてその後、私は、上のものが正常に機能しているのに、なぜ下のものが機能しないのか疑問に思い始めました:

echo "This page is under construction<br/><br/>Current Date: {date('l jS \of F Y')}";

変数が文字列内で非常に正常に機能している場合でも、解析プロセスの背後にあるロジックはどのようになっていますか。

PHPパーサー$の署名後、解析して実行する適切な変数を見つけようとし、変数名を区切るためにも中括弧{}を使用することを読みました。これも私がかなり理解していることです。

しかし、関数のパーサーエンジンを開発する際に、この種の構文が必要であると思われるのは、最初は意味がなかったためです。

基本的に、次のような関数名の文字列表現を保持する変数を定義する必要があるのはなぜですか。

$date = "date";

前もって感謝します。

4

2 に答える 2

4

ドキュメントから

ノート:

{$}内の関数、メソッド呼び出し、静的クラス変数、およびクラス定数はPHP 5以降で機能します。ただし、アクセスされる値は、文字列が定義されているスコープ内の変数の名前として解釈されます。中括弧({})を使用しても、関数やメソッドの戻り値、またはクラス定数や静的クラス変数の値にアクセスすることはできません。

ただし、これを回避するためのハックは次のとおりです。

function _expression($x) { return $x; }
$e = '_expression';

echo "This page is under construction<br/><br/>Current Date: {$e(date('l jS \of F Y'))}";
于 2011-06-02T20:54:33.477 に答える
2

理由は簡単です。二重引用符で囲まれた複雑な解析が発生するための構文はです{$。PHPでは、他のバイトシーケンスがこの動作をトリガーすることはありません。その構文トークンはとして知られていT_CURLY_OPENます。

また、関数を使用できるのは、PHPがオブジェクトと配列の式をサポートしている場合の副産物にすぎません。

于 2011-06-02T20:36:27.400 に答える