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

青灯夜游
リリース: 2023-04-08 14:26:01
転載
3304 人が閲覧しました

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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート