PHP:1行または複数行で連結する方が良いですか?それとも違いはありますか?
-
08-07-2019 - |
質問
違いはありますか、次のいずれかよりも優れています:
$var = '';
...
$var .= 'blah blah';
$var .= $var2;
$var .= 'blah blah';
または
$var = '';
...
$var .= 'blah blah' . $var2 . 'blah blah';
速度に違いはありますか?
解決
文字列をエコーする場合、わずかな違いがあります。
echo $var1,$var2,$var3 // comma (echo with multiple arguments)
わずかに速い
echo $var1.$var2.$var3 // dot (concat and echo)
他のヒント
PEZとTopbitの両方が正しいです。ここで見たよりも良く見えると思うものを指摘したいだけです。
$var = "line 1 \n";
$var .= "line 2 \n";
対
$var = "line 1 \n"
. "line 2 \n";
結果が1つの文字列$ varであることは視覚的に明らかなので、最初の文字列よりも2番目の文字列の方がずっと好きです。また、次のような愚かなバグも防ぎます。
$var = "line 1 \n";
$var .= "line 2 \n";
$vat .= "line 3 \n";
$var .= "line 4 \n";
いくつかの短い文字列については問題ではありません。読みやすいものを使用してください。
しかし、もしあなたがそれらの多く(例えば数千)がそんなに短いものではないなら、あなたはおそらくそれらを配列に保持して一緒に結合したいと思うでしょう。 (たまたま、このようなコードは"。="を使用して文字列を連結するのと同じくらい読みやすいため、パフォーマンスの祭壇の明快さを犠牲にすることはありません。)
編集:上記の考え方は有効ではないと思います。 PHPの文字列は変更可能ですよね
違いはありません。どちらも連結されているため、最も読みやすいものを使用する必要があります。
パフォーマンスが最高の場合は、配列を使用してみて、終了したら破裂させます。
$var = array();
$var[] = "line 1\n";
$var[] = "line 2\n";
$var[] = "line 3";
$var = implode('', $var);
どのような方法でも、数千の大きな弦で作業している場合を除き、速度の違いは無視できます。
コード内で手動で連結するものについては、おそらくパフォーマンスは重要ではないため、読みやすさが重要です。私にとって、これはしばしば heredoc 構文。私がインデント構造を壊す方法は好きではありませんが、改行やタブを文字列に正しく挿入したい場合に特に便利です。
このような短い状況に気付くことはないと思います。私は通常、読みやすさの理由で、使用するものを決定します。私は2つの状況でのみ分割し、それ以外の場合は1行で分割します。
a)複数行の応答を作成して、コードがユーザーに表示される内容を多少模倣します。このように入力ミスや間違いを見つけやすくすることがわかりました。
$var = "line 1 \n";
$var .= "line 2 \n";
b)行の長さ。行がウィンドウをオーバーフローする場合、通常は行を分割するので、行の最後まで読んで行末を読む必要はありません。ほとんどの言語は行継続文字をサポートしているため、実際にコード内で改行する必要はありませんが、それを持たない一部の言語で作業するので習慣にしています。
大量のデータを単一の文字列に入れる最も速い方法は、エコーされた出力をキャプチャする出力バッファリングです。
ob_start();
/* many echos. For example, in a loop */
$outString = ob_get_contents(); // get the complete string
ob_end_clean();
一般に、プログラムの速度に大きな違いをもたらす可能性は低いので、後でそれを修正/更新するために戻ってくる必要があるので、何をしているのかを明確に見せてください。読みやすさが重要です。
意味のある違いはありません。コーディングの好みの問題です。
配列を作成してから内破するのが最速の方法かもしれないという予感がありました。私は間違っていた!しかし、$ str = $ str + $ blaを実行すると、桁違いに本当に遅くなります!大量の連結を行う場合にのみ重要です。テストコードは次のとおりです。
<?php
function doit($n) {
$str2concat = 'Esta es una prueba. ¿Cuál manera es más rápida?';
$str = '';
// option 1
$start = microtime(true);
for( $i=0; $i <= $n; $i++ ) {
$str .= $str2concat;
}
$end = microtime(true);
echo " Concat: $n Iterations, duration:" . ($end-$start) . "\n";
// option 2
$str = '';
$start = microtime(true);
for( $i=0; $i <= $n; $i++ ) {
$str = $str . $str2concat;
}
$end = microtime(true);
echo "Concat2: $n Iterations, duration:" . ($end-$start) . "\n";
// option 3
$str = [];
$start = microtime(true);
for( $i=0; $i <= $n; $i++ ) {
$str[] = $str2concat;
}
$str = implode( $str );
$end = microtime(true);
echo "Implode: $n Iterations, duration:" . ($end-$start) . "\n\n";
}
doit( 5000 );
doit( 10000 );
doit( 100000 );
私が得た結果は次のとおりです。
Concat: 5000 Iterations, duration:0.0031819343566895
Concat2: 5000 Iterations, duration:0.41280508041382
Implode: 5000 Iterations, duration:0.0094010829925537
Concat: 10000 Iterations, duration:0.0071289539337158
Concat2: 10000 Iterations, duration:1.776113986969
Implode: 10000 Iterations, duration:0.013410091400146
Concat: 100000 Iterations, duration:0.06755805015564
Concat2: 100000 Iterations, duration:264.86760401726
Implode: 100000 Iterations, duration:0.12707781791687