PHP-文字列に変数を連結または直接挿入します


224

PHP変数を文字列に挿入する適切な方法は何ですか?

こちらです:

echo "Welcome ".$name."!"

またはこのように:

echo "Welcome $name!"

これらの方法はどちらもmyで機能しますPHP v5.3.5。後者の方が短くて簡単ですが、最初の方がフォーマットが優れているのか、それとも適切なものとして受け入れられているのかわかりません。


18
あなたが最初のことをしていたら、私は個人的に単一引用符を好むecho 'Welcome '.$name.'!';
KJYe.Name葉家仁


2
@ kjy112私は私の答えで同じことを言った、私は一重引用符の
巨大な

11
個人的には、「一重引用符の方が効率的」という全体を無視して、「内部エスケープの最後の量が必要な引用符スタイルを使用する」だけにします。文字列の解析が少ないか、文字列の連結が多いため、コードを記述しても、MICROSCOPICの利点が得られる可能性はほとんどありません。
Marc B

1
パフォーマンス低下の主張は誤りです。参考として、この記事を参照してください。nikic.github.io/2012/01/09/...
ダミアン

回答:


344

これらの2つの構文の間で、実際に使用する構文を選択する必要があります:-)

個人的には、そのような場合(変数補間)の 2番目のソリューションを使用します。

結果は同じになります。パフォーマンスに影響がある場合でも、問題にはなりません1


補足として、私の答えはもう少し完全です:このようなことをしたい日:

echo "Welcome $names!";

PHPは、$names変数を使用しようとしているかのようにコードを解釈します-変数は存在しません。-文字列に「」ではなく「」を使用した場合にのみ機能することに注意してください。

その日、あなたは使う必要があります{}

echo "Welcome {$name}s!"

連結にフォールバックする必要はありません。


また、最初の構文は次のとおりです。

echo "Welcome ".$name."!";

おそらく、以下を使用して、連結を避けて最適化できます。

echo "Welcome ", $name, "!";

(しかし、以前に言ったように、これはそれほど重要ではありません...)


1-何十万もの連結対補間を実行している場合を除いて-そして、それはおそらくまったくそうではありません。


3
優れたありがとう!文字列に直接挿入する私のお気に入りの方法を使用できることを知ってとても良かったです{}。を使用する必要がある場合に、変数を残りの文字列から分離する方法を知ることができてとても感謝しています。
Web_Designer

64
文字列リテラルと変数をコンマで区切ることは、でのみ機能しecho、他の場所では機能しないことに注意してください。
コリンカメロン2013

3
パフォーマンスについて指摘するだけです:(time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = $string.$i; } print("Done!\n");'連結)は実際には約300ミリ秒の時間で失われます(200.000アイテムの場合、これはセットの1000要素あたり1 miliseconfです...)。これは統計上のノイズであり、違いを測定することさえ不可能です。より読みやすいことを考えると、time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = "{$string}{$i}"; } print("Done!\n");'(補間)は誰もが認める勝者です...
フェルナンドコル

1
補間を使用する場合は、二重引用符を使用する必要があります。
マキシマAlekz

文字列内で関数を使用することは可能ですか?echo "これは{foo()} nice"のようです。?
strix25 2018

17

変数を挿入する必要があるたびに文字列を分割する必要がないため、二重引用符で囲まれた文字列はよりエレガントです(単一引用符で囲まれた文字列で行う必要があるように)。

ただし、関数の戻り値を挿入する必要がある場合は、二重引用符で囲まれた文字列に挿入することはできません。

//syntax error!!
//$s = "Hello {trim($world)}!"

//the only option
$s = "Hello " . trim($world) . "!";

10
PHP 5.3の変数関数を使用して、関数を半間接的に文字列に挿入できます。$x = function() { ...}; $string = "hello {$x(blah blah blah)}"「制限」を回避します。
マルクB

5
@Marcかっこいい、知らなかった!また、変数に既存の関数の名前を割り当て、同じことを行うことができます:$x = 'trim'; $string = "hello {$x('blah blah blah')}";
マイケル・

3
かっこいいですが、非常に読みにくいので、とにかくそれを避けなければなりません。
常識

2
$s = 'Hello ' . trim($world) .'!';文字列に補間するものが何もない場合は、単一引用符を使用してみてください。これによりパフォーマンスが向上し、両方を識別するための規則として使用できます
Sarath Sadasivan Pillai

9

php4以降、文字列フォーマッタを使用できます:

$num = 5;
$word = 'banana';
$format = 'can you say %d times the word %s';
echo sprintf($format, $num, $word);

ソース:sprintf()


はるかに安全なオプションです。+1は、他の言語と一致する優良慣行および一般的な慣習
Javier Arias


5

作成の観点から考えると、シンプル読みやすく一貫性があり、理解やすいと思います(ここではパフォーマンスは問題ではないため)。

  • 埋め込まれた変数を二重引用符で使用すると、オブジェクトのプロパティや多次元配列などを埋め込むときに、複雑で混乱を招く可能性があります。つまり、一般に、埋め込まれた変数を読み取る場合、読み取っている最終的な動作を100%確実に確認することはできません。 。

  • {}and などの松葉杖を追加する必要が頻繁にあり\、IMOは混乱を招き、連結の読みやすさをほぼ同等にします。

  • たとえばhtmlspecialchars($var)、varの周りに関数呼び出しをラップする必要があるとすぐに、連結に切り替える必要があります。

  • 私の知る限り、定数を埋め込むことはできません。

いくつかの特定のケースでは、 "vars埋め込みの二重引用符"が役立つ場合がありますが、一般的に言えば、連結します(便利な場合は単一引用符または二重引用符を使用します)。


5

この質問にはすでに回答が選択されていることは知っていますが、この記事では、文字列補間が連結よりも高速に機能することを明らかに示しています。それはまだ疑問がある人のために役立つかもしれません。


3

最初のものを使用して、単一引用符を使用してください!

  1. 読みやすくなり、他のプログラマーが何が起こっているかを知ることができます
  2. PHPがソースコードを分析するときにオペコードが作成される方法が少し高速に動作します。基本的にはとにかくそれを行うので、手助けをしてください!
  3. 二重引用符の代わりに単一引用符も使用すると、パフォーマンスがさらに向上します。

あなたが必要なときは、二重引用符を使用する必要がある唯一の状況は、あります\r\n\t!オーバーヘッドは、他のケースで使用する価値はありません。

また、チェックする必要がありますPHPの変数の連結phpbench.comを物事の異なる方法にいくつかのベンチマークのために。


19
-1:単一引用符を使用しても、実際のパフォーマンスにはまったく影響しません。リンクされたページは、2つの方法の違いをマイクロ秒単位、つまり0.000001秒で示しています。データベースクエリは何百回もかかるでしょう。この議論は完全に無意味です。
Pekka

について言及するの\rは良い点で\nあり\t、他の回答にはこのビットは含まれていませんでした。
evilReiko 2018年

2

それは好みの問題だけです。
好きなように使ってください。

ほとんどの場合、2番目のものを使用していますが、状況によって異なります。

文字列内の変数を強調表示する優れたエディターを入手することもお勧めします


Iveは必要なtextareaを取得しました。PSPadロック。
Web_Designer

2

連結しないでください。エコーは複数のパラメータを取る可能性があるため、コンマは必要ありません。

echo "Welcome ", $name, "!";

一重引用符または二重引用符の使用に関して、違いはごくわずかです。自分でテストするために、多数の文字列でテストを実行できます。


6
ただし、これはエコーにのみ適用されます。変数の割り当てに試して、コードが爆発するのを見てください。
Marc B

1

あなたは最初のものを選ぶべきです。最初のパフォーマンスが2番目のパフォーマンスよりも高速になることを除いて、違いはありません。

二重引用符で囲まれたPHPの変数が変数の解析に時間がかかる場合。

変数の連結については、この単一引用符または二重引用符を確認してください

これは別の例ですphpにはパフォーマンス上の利点シングルクォートとダブルクォートがありますか?

上のリンクのこの回答がなぜ賛成票を投じられるのか、なぜこの回答が反対票を投じるのか理解できませんでした。

私が同じことを言ったように。

こちらもご覧になれます

PHP、一重引用符または二重引用符のどちらが速いですか?


5
時期尚早の最適化の場合は-1。1つのスクリプトで何百万回も印刷しない限り、パフォーマンスの違いは要因にはなりません。それでも、他の処理を行うと、他の方法ではなく、ある方法で印刷するために費やす可能性がある余分な数秒が小さくなります。 。それらの主な違いは、読みやすさです(2番目のスタイルを選ぶようになります)。
cHao

1
私はあなたの最後の質問に答えようとすることができます。PHPコミュニティには多くのワイルドな噂があり、そのうちのいくつかは非常に強力です。それらを開示することは大変な苦労であり、時間がかかります。しかし、ゆっくりと変化しています。あなたがリンクした答えは、人々が気にしていない時代からの古いものです。この記事では、読んだ記事ではなく、自分の経験に基づいて回答した人もいます。
常識

パフォーマンスの低下はfalse +1 @cHaoです。これは、それを証明するメトリクスのある記事です。 nikic.github.io/2012/01/09/…–
ダミアン

1

SQLコマンドを実行する必要があり、変数が配列メンバーである場合は[]、配列内で単一引用符を使用しないでください(次のように[''])。たとえば、この文字列をSQLコマンドとして使用すると、次のようになりますserver error 500

$con = mysqli_connect('ServerName', 'dbUsername', 'dbPassword');
mysqli_select_db($con, 'dbName')

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray['TraceNo']')";
mysqli_query($con, $sql)

正しい文字列は次のとおりです。

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray[TraceNo]')";

代わりにPDOを使用する必要があります
s3c

0

私はこれが古い質問であることを知っていますが、誰かがすべての長所と短所について言及しなければならないと思います:

より良い構文:それは個人的な好みです。

パフォーマンス:違いはありません。多くの人が述べたように、非現実的に多くの変数を使用する場合は、二重引用符の方が速い場合があります。

より良い使用法:単一引用符(ほとんど)。@Khezが言ったように、単一引用符を使用すると、次のように、関数呼び出しや変数の変更を含め、何でも連結できますecho 'hi ' . trim($name) . ($i + 1);。二重引用符は、単一引用符が行うことができないことを行うことができる唯一のことは、の使用で\n\r\tと同様。

読みやすさ:違いはありません(個人的な好みが適用される場合があります)。

書き込み可能性/再書き込み可能性/デバッグ:1行のステートメントでは違いはありませんが、複数行を処理する場合、デバッグまたは書き込み中に行をコメント/コメント解除する方が簡単です。例えば:

$q = 'SELECT ' .
     't1.col1 ' .
     ',t2.col2 ' .
   //',t3.col3 ' .
     'FROM tbl1 AS t1 ' .
     'LEFT JOIN tbl2 AS t2 ON t2.col2 = t1.col1 ' .
   //'LEFT JOIN tbl3 AS t3 ON t3.col3 = t2.col2 ' .
     'WHERE t1.col1 = ' . $x . ' ' .
     '  AND t2.col2 = ' . $y . ' ' .
   //'  AND t3.col3 = ' . $z . ' ' .
     'ORDER BY t1.col1 ASC ' .
     'LIMIT 10';

より少ないエスケープ:単一引用符。単一引用符の場合は、2文字('および\)のみをエスケープする必要があります。二重引用符のためには、2つの文字(エスケープする必要があり"\必要な場合)と3以上を(${})。

少ない変更:単一引用符。たとえば、次のコードがあるとします。

echo 'Number ' . $i . '!';

そして、1を$ iに増やす必要があるので、次のようになります。

echo 'Number ' . ($i + 1) . '!';

ただし、二重引用符の場合は、これを変更する必要があります。

echo "Number $i!";

これに:

echo "Number " . ($i + 1) . "!";

結論好きなものを使用してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.