php.netの印刷マニュアルの例に出くわしました。その統計。
echo 3 . print(2) . print(4) . 5 . 'c' .
print(6) . print(7). 'b' .print(8) . 'a';
を印刷し8a7b16145c12131
ます。しかし、どのように?
.
このコードからの唯一の出力はからのものecho
であり、他のすべての関数はechoの引数にのみ「寄与する」と思わせる連結演算子の存在にだまされたと思います。もちろん、それは間違っています。なぜなら、出力ストリームに即座に(呼び出し時に)出力するのではなく、何らかの方法で動作を変更して出力をそこに返すと想定したprint()
からです。連結するのは文字列とそれぞれの**戻り値**だけです。そして後者は、マニュアルによれば常に「1」です。に変更すると、すべての「魔法」がなくなります。print()
print()
sprintf()
ところで、それは良い頭脳です-しばらく忙しくすることができます:)
OPのリクエストで編集
ここでの「犯人」はですprint
。これは実際の関数ではなく、評価中の処理方法に影響を与える言語構造であることに注意してください。例えば:
echo 3 . print(2) . 'c';
生成:
2c31
しかし、あなたがprint
このような機能に移行した場合:
function x($a) { return print $a; }
echo 3 . x(2) . 'c';
そうすれば、出力はより正常に見えます。
231c
詳細を気にする場合は、Zend Engineのソースに潜入する必要がありますが、一般的に、このような構文は有用なものすべてに使用される可能性があります。覚えるprint
だけで十分です。
そして、なぜとにかく「231c」が表示されるのですか?これは、引数を最初に評価する必要があるためです。それがないと、PHPは何をエコーするかを実際に認識しません(または部分的にecho
知ることができます)。したがって、PHPはこのように多かれ少なかれ行きます:
x(2)
-この関数はそうするprint
ので、引数( "2")は即座に出力に出力されます。関数はprint
常に「1」を返すため、関数は「1」を返します(マニュアルを参照)。PHPは「1」をに連結し、「31」になります。echo
一時的な文字列。echo
実際には「31c」のみを出力することに注意してください。接頭辞「2」はprint
出力であり、その間LFを使用していなかったため(または<br />
コンソールでこれをテストしていない場合)、すべての出力が1行になります。LF(または)を使用するようにコードを変更した場合<br />
:
function x($a) { return print $a; }
$f = 3 . x(2) . 'c';
echo "\n${f}";
その場合、出力は次のようになります。
2
31c
お役に立てれば。
マニュアルに記載されているように、右から左に「a」などと連結して「8」を出力します。そしてエコーはその「1」を印刷します
例
<?php
echo print(8) . 'a';
?>
8a1を印刷します