web-dev-qa-db-ja.com

PHP)でのECHO構文の連結

_echo ._を使用して、小さな関数( WordPress )を作成しました

_/* .. Some code */
switch ($linktype) {
    case "next":
        echo '<p class="next">' . previous_post_link('%link',''.$prevthumbnail.'') . '</p>';
        break;
    case "prev":
        echo '<p class="prev">' . next_post_link('%link',''.$nextthumbnail.'') . '</p>';
        break;
}
/* .. Some other code*/
_

私が知っている「通常の」連結構文を使用する...

_echo '<p class="next">'. previous_post_link('%link',''.$prevthumbnail.'') . '</p>';
_

...プロデュース...

_<p class="next"></p>< result of previous_post_link() >
_

明らかに<p class="next">< result of previous_post_link() ></p>が必要です。ドット( '。')をコンマ( '、')に置き換えることを提案する投稿を見つけたので、今は持ってる...

_echo '<p class="next">' , previous_post_link('%link',''.$prevthumbnail.'') , '</p>';
_

...これは機能します。これは問題に対処するための「正しい」方法ですか、それとも機能する単なる「ハック」ですか?より良いアプローチはありますか?

13
krembo99

カンマの方が速いです。

echo構文では、複数の「パラメーター」を使用できます。カンマを使用してechoすると、出力は1つずつバッファに直接送信されます。 _._を使用する場合は、最初に連結する必要があります。

これはほとんどのアプリケーションで速度に大きな打撃を与えることはありませんが、とにかくechoにコンマを使用することを一般的に習慣にしています。

興味がある場合は、ベンチマークを次に示します。 http://www.electrictoolbox.com/php-echo-commas-vs-concatenation/


編集:さて、これが物事が「故障」している理由です。 (これがずっと根本的な質問であることがわかったので、すべての人に謝罪します。)echoと_._を組み合わせると、echoが実行する前に最初に連結します。その仕事。そのためには、各式を最初に評価する必要があります。このことを考慮:

_echo (5+5) . (10+10);
_

PHPは最初に_(5+5)_を評価し、次に_(10+10)_を評価します。これは、これに変換するのと同じです。

_echo 10 . 20;
_

そして、これらは連結する必要があるため、文字列に変換されて次のようになります。

_echo "1020";
_

それは理にかなっていますか?ここで、関数previous_post_link()について考えてみましょう。 @Timは、この関数からの戻り値がないことはまったく正しいです。その関数が評価されると、何も返さず、何かをエコーし​​ます。したがって、これを行うと:

_echo "test" . previous_post_link();
_

まず、両方が評価されます。 _"test"_はすでに文字列ですが、連結の戻り値を取得するには、最初に関数previous_post_link()を実行する必要があります。実行すると、previous_post_link()は何かを出力し、何も返しません。次に、_"test"_は何も連結されず、その連結はechoを介して出力されます。

ここで、代わりにコンマを使用するとします。

_echo "test", previous_post_link();
_

PHPは、echo構造のすべての「パラメーター」を順番に評価し、それらを出力します。最初に_"test"_が出力され、次にprevious_post_link()が評価されます。これは独自の出力を持ち、何も返さないため、何も出力されません。

これがより明確になることを願っています。そうでない場合は投稿してください。

26
Brad

問題は、 WordPressprevious_post_link('%link',''.$prevthumbnail.'')関数には実際には独自の印刷コマンドが組み込まれており、エコーが印刷を終了した後に印刷することです。

このコマンドをエコー内で使用する(または文字列に保存する)場合は、 get_previous_posts_linkprintingの代わりに値を返します。

7
Tim

私への将来のメモとして:

$squarer = function ($x) { $out = $x*$x; echo "done!\n"; return $out; };

echo 'The square of 2 is ' . $squarer(2) . "!\n";
echo 'The square of 2 is ', $squarer(2), "!\n";

// **** OUTPUT ****
// done!
// The square of 2 is 4!
// The square of 2 is done!
// 4!
1
gurghet

ドットを使用すると、何らかの方法(式、関数)で評価する必要があるすべてのものが、必然的に最後まで「プッシュ」されますか?

この動作を再現することはできません。そして、私の知識によれば、それは逆であるはずです。エコーされた(評価されていない)値が最初になり、次にエコーの結果になります。

評価とエコーの2つの問題を混ぜ合わせているようです。
連結すると、すべての式が順番に評価されます。

function aplus($b){
  global $a;
  $a += $b;
}

$a=1;

echo $a."|".aplus(1).$a."||".aplus(1).$a;

一方、エコーを独自の出力を持つステートメントと混合するのが悪い場合は、この個別のエコーが最初に実行されます。

function e($s){
  echo $s;
}

$a=1;

echo $a."|".e($a +1)."||".e($a+2);
1

さて、ブラッドのオフトピックに対抗するためのオフトピック。

彼はコンマの方が速いと言っています。
それは真実ではありません。また、1台の新車が2セント安い場合、他の車よりも安いと言うのも真実ではありません。サービス、ギフト、ショップまでの距離など、何千もの違いがあり、2セントの違いはまったく無視できます。正気の買い手は決して2セントの差を考慮に入れません。
こっちも一緒。

この答えはただの欺瞞であり、あなたに間違った考えをさせます。 Wordpressは世界で最も遅いアプリケーションの1つです。そして本当にスピードアップしたいのなら彼らはプロファイリングとスピード最適化の多くの仕事をしなければなりません。カンマをドットに変更しても、その数にはなりません。
それがポイントです。コンマの方が速いことを学び、「私は速いコードを書いている!!!」と思います。それは完全に間違っていますが。まず、コード自体は常に高速です。私はあなたのコードを遅くするデータ操作ではありません!たとえば、Wordpresssは、呼び出されるたびに数メガバイトのローカリゼーションデータを解析してメモリにロードしています。このデータをキャッシュに入れると、wordpress 2倍速くなります!それが私がしたいことです「習慣をつける」の。
コード内のすべてのドットをコンマに変更しても、違いを測定することはできません。人工的な違いではなく、本当の違いです。これは特にechoに当てはまります。これは、正気のアプリケーションが何百万回もエコーを使用しないためです。

0