答案 0 :(得分:222)
点(.
)在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 :(得分:63)
因为它被解释为1.
.
.1
(1
和0.1
)因此您得到10.1
答案 2 :(得分:45)
应用大括号会说清楚:
(1.) . (.1)
1.
被解释为1
.
是字符串连接 .1
被解释为0.1
这全部放入一个字符串10.1
作为字符串。
var_dump(1...1)
收益string(4) "10.1"
答案 3 :(得分:22)
不同的操作。
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
被视为no 4和no 5的串联,产生10.1