PHPの構文ルールの詳しい説明

巴扎黑
リリース: 2016-11-24 13:16:15
オリジナル
1091 人が閲覧しました
  1. 簡単な構文ルール (変数名を中かっこで区切ります。PHP のすべてのバージョンに適用されます):

$a = 'flower';
echo "She received some $as";
// 无效;字母s会被当成有效的变量名组成元素,但是这里的变量是$a
echo "She received some ${a}s"; // 有效
echo "She received some {$a}s"; // 有效;推荐的使用方法
ログイン後にコピー

私たちが表現したいのは「彼女は花をいくつか受け取りました」であり、文脈内の「花」という単語は次のようになります。複数形 (つまり S も) を最後に追加する必要がありますが、変数が何も定義されていない場合は、最初のエコーが発生します。明らかに、出力を $as ではなく $a にしたいのです。では、通常、この出力をどのように処理するのでしょうか?

echo "She received some $a"."s"; 
echo "She received some ".$a."s";
ログイン後にコピー

これら 2 つの慣習的な書き方は、中括弧を使った書き方ほど簡潔で明確ではないはずですよね。
注: { が $ の前にあるか後にあるかに関係なく、中括弧は 2 つがすぐに隣接している場合にのみ区切り記号とみなされます。間にスペースを追加しないでください。そうしないと、通常の中括弧として扱われます

echo "She received some { $a}s"; 
// 输出的结果为:She received some { flower}s
ログイン後にコピー

2. 複雑な構文規則 (PHP4+ で使用される式の定義などに中括弧を使用する):

echo "有效的写法: {$arr[4][3]}";
// 有效;界定多维数组
echo "有效的写法: {$arr['foo'][3]}";
// 有效;当在字符串中使用多维数组时,一定要用括号将它括起来
echo "有效的写法: {$this->width}00"; 
// 有效;如果不界定的话,就会变成 $this->width00
echo "有效的写法: {$this->value[3]->name}";  
// 有效;该例演示了界定链式调用
echo "有效的写法: $name: {${$name}}"; 
// 有效;该例演示的效果实际上是一个可变变量
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 "This is $arr[d]";
// 我们发现这样写是没有问题的,那么我们像下面这样写呢?
echo $arr[d];
ログイン後にコピー

はこのようなエラーを生成しました:
注意: 未定義の定数 d の使用 - 'd' であると仮定します
注: 未定義の定数 d が使用されていますが、これはおそらく 'd' であるはずです
そこで、次のようにコードを修正すると

error_reporting(E_ALL);
$arr = array('a', 'b', 'c', 'd'=>'e');
define('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 "This is $arr[d][e]";
ログイン後にコピー

まだ正しく解析できますか?中括弧の追加は必ず必要だということだけをお伝えしたいと思います。もちろん、あなたが私の生徒でない場合、私はそこまで制御できません...

注 3:

error_reporting(E_ALL);  
$arr = array('a', 'b', 'c', 'd');  
echo "This is {$arr[2]} <br />";  
echo "This is {$arr[&#39;2&#39;]} <br />";
ログイン後にコピー


上記のコードを実行してください。結果は同じなのですが、なぜそうなるのでしょうか?私が言えるのは、PHP は弱い型付けの言語であるということだけです。弱い型付けの言語とは何かについては、ここでは詳しく説明しません。自分でGoogleで調べてみてください。ここまで述べてきましたが、これらの構文規則の利点を最もよく反映する具体的なアプリケーションはどこでしょうか? ----SQL ステートメント

Java コード

// 示例一:  
$SQL1 = "select * from table where id={$_GET[&#39;id&#39;]}";  
// 示例二:  
$SQL2 = "select * from table where id={$this->id}";
ログイン後にコピー


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート