_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>';
_
...これは機能します。これは問題に対処するための「正しい」方法ですか、それとも機能する単なる「ハック」ですか?より良いアプローチはありますか?
カンマの方が速いです。
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()
が評価されます。これは独自の出力を持ち、何も返さないため、何も出力されません。
これがより明確になることを願っています。そうでない場合は投稿してください。
問題は、 WordPressprevious_post_link('%link',''.$prevthumbnail.'')
関数には実際には独自の印刷コマンドが組み込まれており、エコーが印刷を終了した後に印刷することです。
このコマンドをエコー内で使用する(または文字列に保存する)場合は、 get_previous_posts_link
、printingの代わりに値がを返します。
私への将来のメモとして:
$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!
ドットを使用すると、何らかの方法(式、関数)で評価する必要があるすべてのものが、必然的に最後まで「プッシュ」されますか?
この動作を再現することはできません。そして、私の知識によれば、それは逆であるはずです。エコーされた(評価されていない)値が最初になり、次にエコーの結果になります。
評価とエコーの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台の新車が2セント安い場合、他の車よりも安いと言うのも真実ではありません。サービス、ギフト、ショップまでの距離など、何千もの違いがあり、2セントの違いはまったく無視できます。正気の買い手は決して2セントの差を考慮に入れません。
こっちも一緒。
この答えはただの欺瞞であり、あなたに間違った考えをさせます。 Wordpressは世界で最も遅いアプリケーションの1つです。そして本当にスピードアップしたいのなら彼らはプロファイリングとスピード最適化の多くの仕事をしなければなりません。カンマをドットに変更しても、その数にはなりません。
それがポイントです。コンマの方が速いことを学び、「私は速いコードを書いている!!!」と思います。それは完全に間違っていますが。まず、コード自体は常に高速です。私はあなたのコードを遅くするデータ操作ではありません!たとえば、Wordpresssは、呼び出されるたびに数メガバイトのローカリゼーションデータを解析してメモリにロードしています。このデータをキャッシュに入れると、wordpress 2倍速くなります!それが私がしたいことです「習慣をつける」の。
コード内のすべてのドットをコンマに変更しても、違いを測定することはできません。人工的な違いではなく、本当の違いです。これは特にecho
に当てはまります。これは、正気のアプリケーションが何百万回もエコーを使用しないためです。