这个问题在这里已有答案:
我刚刚面对3v4l的一小段PHP片段:https://3v4l.org/jmrZB
echo 1...1; //10.1
而且我担心我不知道如何解释其结果 . 为什么这被认为是有效的?
点( . )在PHP中有两个角色:
.
作为十进制数字,当它是实数的一部分时,例如 1.1 . 对于实数 but not on the same time ,积分部分和小数部分都是可选的 . 这意味着 1. 和 .1 都是PHP中的有效实数,但 . 不是数字 .
1.1
1.
.1
作为string concatenation operator . 此运算符将两个字符串子表达式连接到一个更大的表达式 . 较大表达式的值是子表达式的字符串值的串联 . 在串联之前,非字符串的子表达式将转换为字符串 .例如 . 1 . 1 与 '1' . '1' 相同,其值为字符串 '11' .
1 . 1
'1' . '1'
'11'
表达式 1...1 被解析为 1. . .1 . 根据上述说法, 1. 和 .1 是实数( 1.0 和 0.1 ),中间点( . )是字符串连接运算符 .
1...1
1. . .1
1.0
0.1
将数字转换为字符串时,PHP使用此操作所需的最少字符数 . 如果实数只有整数部分,那么它将数字表示为整数,不带小数点和小数 .
这就是 1. . .1 与 '1' . '0.1' 相同的原因,表达式的最终值为 10.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) 收益率 string(4) "10.1"
var_dump(1...1)
string(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
4 回答
点(
.
)在PHP中有两个角色:作为十进制数字,当它是实数的一部分时,例如
1.1
. 对于实数 but not on the same time ,积分部分和小数部分都是可选的 . 这意味着1.
和.1
都是PHP中的有效实数,但.
不是数字 .作为string concatenation operator . 此运算符将两个字符串子表达式连接到一个更大的表达式 . 较大表达式的值是子表达式的字符串值的串联 . 在串联之前,非字符串的子表达式将转换为字符串 .
例如 .
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)
收益率string(4) "10.1"
不同的操作 .
现在,我们奇怪的操作
被视为4号和5号的串联,产生10.1