Php 为什么1…1评估为10.1?

Php 为什么1…1评估为10.1?,php,echo,ellipsis,Php,Echo,Ellipsis,我刚刚遇到了3v4l中的一个小PHP片段: 恐怕我不知道如何解释它的结果。为什么这被认为是有效的呢?因为它被解释为1。.1(1和0.1)因此你得到10.1点()在PHP中有两个角色: 作为十进制数字,当它是实数的一部分时,例如1.1。整数部分和小数部分在实数上都是可选的,但不能在同一时间。这意味着1.和.1在PHP中都是有效的实数,但不是数字 作为第一个。此运算符将两个字符串子表达式连接到一个较大的表达式中。较大表达式的值是子表达式的字符串值的串联。非字符串的子表达式在连接之前转换为字符串。 例

我刚刚遇到了3v4l中的一个小PHP片段:


恐怕我不知道如何解释它的结果。为什么这被认为是有效的呢?

因为它被解释为
1。
.1
1
0.1
)因此你得到
10.1

点(
)在PHP中有两个角色:

  • 作为十进制数字,当它是实数的一部分时,例如
    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.
      被解释为
      1
    • 是字符串连接
    • .1
      被解释为
      0.1
    所有这些都放在一个字符串中,即
    10.1
    作为一个字符串

    var\u dump(1…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
    

    被视为4号和5号的串联,结果是10.1

    Uhm,我想。。。是splat接线员,干得不错。连接操作不是加号。似乎有道理,但PHP通常不使用点连接数字,但出于某种原因,这里是这样的。PHP按照您的指示执行。在这里,您可以告诉它连接
    项。因为项目不是字符串-php将它们转换为字符串。没有“串联数字”这样的东西。串接字符串;在连接之前,数字首先转换为字符串。我刚刚尝试了
    echo 1/.1
    ,结果是
    10
    。为什么即使只有一个,它仍然将两个整数连在一起呢?@Swellar
    1/.1
    除以0.1,即10。
    1/.1
    是一个数字。它是
    1
    除以
    0.1
    。表达式
    1/.1
    的值为
    10
    。没有涉及字符串。假设这个答案是正确的,为什么
    1..1
    1..1.
    都不打印“11”?解析器很贪婪。当片段仍然生成有效标记时,它会尽可能多地读取。这就是为什么
    1.
    是一个浮点数,而不是后跟串联运算符(
    )的整数
    1
    )。出于同样的原因,
    1..1
    1。
    后接
    .1
    1..1。
    1。
    后接
    .1
    后接
    。注意:SO语法高亮显示使第一个点变红,而其他点变黑。我认为这是一个很好的暗示。如果最后一个点也是红色就好了,但总比没有好。从近3个月前开始:棘手的连接问题…应用大括号只有在你已经知道在哪里应用时才清楚。@pipe这就是为什么我展示了如何应用大括号。
    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