2

php.netの印刷マニュアルの例に出くわしました。その統計。

   echo 3 . print(2) . print(4) . 5 . 'c' . 
   print(6) . print(7). 'b' .print(8) . 'a';

を印刷し8a7b16145c12131ます。しかし、どのように?

4

2 に答える 2

3

.このコードからの唯一の出力はからのもの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はこのように多かれ少なかれ行きます:

  • 一時的な文字列に「3」を取得します
  • 関数を呼び出すx(2)-この関数はそうするprintので、引数( "2")は即座に出力に出力されます。関数はprint常に「1」を返すため、関数は「1」を返します(マニュアルを参照)。PHPは「1」をに連結し、「31」になります。
  • 'c'を取得して連結すると、「31c」になります。
  • 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

お役に立てれば。

于 2012-09-17T17:29:52.147 に答える
0

マニュアルに記載されているように、右から左に「a」などと連結して「8」を出力します。そしてエコーはその「1」を印刷します

<?php
echo print(8) . 'a';
?>

8a1を印刷します

于 2012-09-17T17:24:16.830 に答える