3v4lからのちょっとしたPHPスニペットに直面しました: https://3v4l.org/jmrZB
echo 1...1; //10.1
そして、その結果を説明する方法がわからないのではないかと思います。なぜこれがまったく有効と見なされるのですか?
PHPでは、ドット(.
)には2つの役割があります。
1.1
。整数部と小数部は、実数ではオプションですが、同じ時間ではオプションではありません。これは、1.
と.1
の両方がPHPの有効な実数であるが、.
が数値ではないことを意味します。1 . 1
は'1' . '1'
と同じであり、その値はストリング'11'
です。式1...1
は、1. . .1
として解析されます。上記によると、1.
と.1
は実数(1.0
と0.1
)であり、中点(.
)は文字列連結演算子です。
数値を文字列に変換するとき、PHPはこの操作に必要な最小文字数を使用します。実数に整数部分のみがある場合は、小数点と小数なしで整数として数値を表します。
これが1. . .1
が'1' . '0.1'
と同じであり、式の最終値が10.1
である理由です。
1...1
がこのように解析されるのですか?パーサーは、式を左から右に読み取ります。 1
は、そこから数字が始まることを伝えます。 1.
は有効な実数ですが、1..
は有効ではありません。 1.
を数値として保持し、次のドットは連結演算子です。次の.
は、数字が続き、別の実数(.1
)の始まりです。
全体として、1...1
は1. . .1
と同じです。
1.
.
.1
(1
および0.1
)として解釈されるため、10.1
を取得します
中括弧を適用すると、明確になります。
(1.) . (.1)
1.
は1
として解釈されます.
は文字列です連結.1
は0.1
として解釈されますこれはすべて文字列に入れられる10.1
文字列としてです。
var_dump(1...1)
yieldsstring(4) "10.1"
異なる操作。
1. <?php echo 1.1; ?> // gives simple 1.1
2. <?php echo 1...1; ?> // gives 10.1
3. <?php echo 1..'1'; ?> // gives 11
4. <?php var_dump(1.); ?> // gives 1
5. <?php var_dump(.1); ?> // gives 0.1
今、私たちの奇妙な操作
echo 1...1
4と5の連結として扱われ、10.1になります