1. 単純な構文ルール (変数名を中括弧で区切ります。PHP のすべてのバージョンに適用されます):
$a = '花';
echo "彼女は $as を受け取りました";
// 無効; 文字 s は有効な変数名コンポーネント要素として扱われますが、ここでの変数は $a
です。
echo "彼女はいくつかの ${a} を受け取りました" // 有効
;
echo "彼女はいくつかの {$a} を受け取りました" // 推奨される使用法
;
私たちが表現したいのは、「彼女は花を受け取りました」ということです。コンテキスト内の Flower は複数形にする必要があります (つまり、後ろに S を追加する必要があります)。ただし、変数が何も定義されていない場合、最初のエコーは次のようになります。という状況が現れる。明らかに、出力を $as ではなく $a にしたいのです。では、通常、この出力をどのように処理するのでしょうか?
echo "彼女は $a を受け取りました"."s";
echo "彼女はいくつかの ".$a." を受け取りました";
// これら 2 つの一般的な記述方法は、中括弧を使用した記述方法よりも簡潔で明確ではありません。
注: { が $ の前後にあるかどうかに関係なく、中括弧は 2 つがすぐに隣接している場合にのみ区切り記号とみなされます。間にスペースを入れないでください。入れないと通常の中括弧
として扱われます。
echo "彼女はいくつかの { $a} を受け取りました";
//出力結果は次のようになります: 彼女はいくつかの {flower} を受け取りました
2. 複雑な構文ルール (PHP4+ で使用される式などを定義するには中括弧を使用します):
echo "有効な書き込み: {$arr[4][3]}";
// 有効; 定義された多次元配列
echo "有効な書き込み: {$arr['foo'][3]}";
// 有効; 文字列内で多次元配列を使用する場合は、必ず括弧で囲んでください
echo "有効な書き込み: {$this->width}00";
// 有効; 定義されていない場合は、$this->width00
になります。
echo "有効な書き込み: {$this->value[3]->name}";
// 有効; この例は、境界付きチェーン呼び出しを示しています
echo "有効な書き込み: $name: {${$name}}";
// 有効です。この例で示されている効果は実際には変数 variable
です。
echo "有効な書き込み: {${getName()}}";
// 有効; この例は、関数の戻り値を変数名として使用する方法を示しています
echo "有効な配信: {${$this->getName()}}";
// 有効; この例は、関数の戻り値を変数名として使用する方法を示しています
注 1: echo "次のように書くのは有効ですか: {getName()}" 出力結果は次のようになります: '次のように書くのは有効です:
{getName()}」。 $ が含まれていないため、中括弧は区切り文字として使用されません
注 2: echo "次のように書くのは有効ですか: {$arr[foo][3]}"; この質問に答える前に、まず実験を行ってみましょう:
error_reporting(E_ALL);
$arr = array('a', 'b', 'c', 'd'=>'e');
echo "これは $arr[d] です";
// このように書いても問題ないことが分かったので、こう書いてみるとどうなるでしょうか?
echo $arr[d];
このエラーが発生しました:
注意: 未定義の定数 d の使用 - 'd'
と仮定します
注: 未定義の定数 d が使用されました。おそらく 'd' である必要があります
したがって、コードを次のように変更すると
error_reporting(E_ALL);
$arr = array('a', 'b', 'c', 'd'=>'e');
定義('f', 'd');
echo $arr[f];
今回は問題がないことがわかりました。文字列中の配列のインデックスがシングルクォーテーションで囲まれていなければ問題ないことがわかりますが、この書き方が文字列中にない場合はエラーが報告され、{$arr[foo] の場合は][3]} 文字列内の解析は非文字列解析に基づいています。したがって、インデックスに一重引用符を追加せずに、文字列内の配列を区切るために中括弧のみを追加するのは誤りです。プログラムは一重引用符なしでインデックスを定数として解析するため、エラーが生成されます。正しい書き方は次のようになります:
echo "有効な書き込み: {$arr['foo'][3]}";
特別な注意事項: echo "This is $arr[d]"; この書き込みメソッドはプログラムによって解析できますが、配列が 1 次元配列の場合に限定されます。厳密な記述方法は次のようにする必要があります: echo "This is {$arr['d']}"; 私の生徒はかつてこの点について私と議論しました:前の記述方法で結果が得られるのに、なぜそれを使用する必要があるのですか?後者の書き方はどうでしょうか?次に、前のコードの変更を続けましょう
error_reporting(E_ALL);
$arr = array('a', 'b', 'c',
'd'=>array('e'=>f')
);
echo "これは $arr[d][e] です";
これでも正しく解析できますか?中括弧の追加は必ず必要だということだけをお伝えしたいと思います。もちろん、私の生徒ではない場合は、そこまでコントロールすることはできません...
注3:
error_reporting(E_ALL);
$arr = array('a', 'b', 'c', 'd');
echo "これは {$arr[2]} です";
echo "これは {$arr['2']} です";
上記のコードを実行します。結果は同じなのですが、なぜそうなるのでしょうか?私が言えるのは、PHP は弱い型付けの言語であるということだけです。弱い型付けの言語とは何かについては、ここでは詳しく説明しません。自分でGoogleで調べてみてください。ここまで述べてきましたが、これらの構文規則の利点を最もよく反映する具体的なアプリケーションはどこでしょうか? ----SQL ステートメント
// 例 1:
$SQL1 = "select * from table where id={$_GET['id']}";
// 例2:
$SQL2 = "select * from table where id={$this->id}";