ホームページ  >  記事  >  バックエンド開発  >  phpのvar_dump(1...9)は何を出力しますか?

phpのvar_dump(1...9)は何を出力しますか?

青灯夜游
青灯夜游転載
2020-04-13 09:18:093298ブラウズ

var_dump(1...9) は何を出力しますか?次の記事でそれを分析します。一定の参考値があるので、困っている友達が参考になれば幸いです。

phpのvar_dump(1...9)は何を出力しますか?

質問 var_dump(1...9)出力は何ですか?

手動で確認してください:

php -r “var_dump(1...9)”;
string(4) ”10.9“

出力 10.9. 一見すると、この var_dump の出力は奇妙に見えますよね。なぜ?

ここでは、PHP コードの一部を見てその出力が奇妙だと感じた場合、最初の反応は、このコードによって生成されたオペコードが何であるかを確認することです。この問題は実際には問題ですが、字句解析の段階ではありますが、まだ phpdbg で解析しましょう (通常、opcache の影響を避けるために、-n が渡されます):

phpdbg -n -p /tmp/1.php
function name: (null)
L1-35 {main}() /tmp/1.php - 0x7f56d1a63460 + 4 ops
L2 #0 INIT_FCALL<1> 96 "var_dump"
L2 #1 SEND_VAL "10.9" 1
L2 #2 DO_ICALL
L35 #3 RETURN<-1> 1

つまり、opcode が生成されるずっと前にあるようです。 ...9 は、リテラル値であることを考慮すると、定数 10.9 になります。zend_ language_scanner.l を見て、次の行を見つけてください:

DNUM ({LNUM}?"."{LNUM})|({LNUM}"."{LNUM}?)

これは、字句解析によって定義された浮動小数点数の形式です。この時点で突然気づきました:

1 ...9 は、1. (浮動小数点数 1)、次に . (文字列連結記号)、そして .9 (浮動小数点数) として順番に受け入れられます。 0.9)

したがって、コンパイル フェーズ中に直接生成されます "1" . "0.9" -> 文字列リテラル "10.9"

さて、ここで、この小さな「パズル」について説明します。明らかに。

もちろん、これは PHP で定義されているだけではなく、ほとんどすべての言語でこの省略形の浮動小数点形式が定義されています。C 言語では、浮動小数点整数を入力するために、たとえば 1 を使用することができます。 . これが浮動小数点数であることをコンパイラに伝えるためです。

ただし、第一に、これはたまたま PHP に存在します。この数値には、文字列の連結という別の意味があります。第二に... PHP5.6 ではSplat 演算子と呼ばれる新しい演算子があり、可変パラメーター関数を定義したり、配列を解決したりするために使用できます (例:

<?php
 
function  foo($a, $b, $c) {
        var_dump($a + $b + $c);
}
 
 
$parameters = array (1, 2, 3);
 
foo(...$parameters);
?>

)。つまり、一見したところ、この混乱を招く結果が生じます

推奨される学習: PHP ビデオ チュートリアル

以上がphpのvar_dump(1...9)は何を出力しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlaruence.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。