I've just faced a little PHP snippet from 3v4l: https://3v4l.org/jmrZB
echo 1...1; //10.1
And I'm afraid I have no idea how to explain its results. Why is this considered valid at all?
I've just faced a little PHP snippet from 3v4l: https://3v4l.org/jmrZB
echo 1...1; //10.1
And I'm afraid I have no idea how to explain its results. Why is this considered valid at all?
The dot (.
) has two roles in PHP:
1.1
. Both the integral part and the decimal part are optional on real numbers but not on the same time. This means both 1.
and .1
are valid real numbers in PHP but .
is not a number.1 . 1
is the same as '1' . '1'
and its value is the string '11'
.The expression 1...1
is parsed as 1. . .1
. According to those said above, 1.
and .1
are real numbers (1.0
and 0.1
) and the middle dot (.
) is the string concatenation operator.
When converts numbers to strings, PHP uses the minimum amount of characters required for this operation. If a real number has only integral part then it represents the number as integer, without decimal point and decimals.
This is why 1. . .1
is the same as '1' . '0.1'
and the final value of the expression is 10.1
.
1...1
parsed this way?The parser reads the expression from left to right. 1
tells it a number starts there. 1.
is a valid real number but 1..
is not. It keeps 1.
as a number then the next dot is the concatenation operator. The next .
, being followed by a digit, is the beginning of another real number (.1
).
All in all, 1...1
is the same as 1. . .1
.
echo 1/.1
, it resulted in 10
. How come it still concatenated the two integer even with just one .
? –
Byers 1/.1
is divide 1 by 0.1
which is 10. –
Some 1/.1
is a number. It is 1
divided by 0.1
. The value of expression 1/.1
is 10
. There is no string involved. –
Abloom 1
tells it a number starts there, 1.
is a valid real number, 1..
is not; it keeps 1.
as a number then the next dot is the concatenation operator; the next .
, being followed by a digit, is the beginning of another real number (.1
). –
Abloom 1..1
nor 1..1.
print "11"? –
Skeet 1.
is a float number and not the integer 1
followed by the concatenation operator (.
). For the same reason, 1..1
is 1.
followed by .1
and 1..1.
is 1.
followed by .1
followed by .
. –
Abloom Because it's interpreted as 1.
.
.1
(1
and 0.1
) therefore you get 10.1
concatenate
items. As items are not string - php converts'em to strings. –
Some Applying braces will make it clear:
(1.) . (.1)
1.
is interpreted as 1
.
is string concatenation.1
is interpreted as 0.1
This all put into a string is 10.1
as a string.
var_dump(1...1)
yieldsstring(4) "10.1"
Different Operations.
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
Now, our strange operation
echo 1...1
is treated as concatenation of no 4 and no 5, resulting in 10.1
© 2022 - 2024 — McMap. All rights reserved.