Я только что столкнулся с небольшим фрагментом PHP из 3v4l: https://3v4l.org/jmrZB
echo 1...1; //10.1
И, боюсь, я понятия не имею, как объяснить его результаты. Почему это считается действительным вообще?
Я только что столкнулся с небольшим фрагментом PHP из 3v4l: https://3v4l.org/jmrZB
echo 1...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
и 0.1
), вы получаете 10.1
Применение фигурных скобок даст понять:
(1.) . (.1)
1.
интерпретируется как 1
.
- конкатенация строк.1
интерпретируется как 0.1
Все это помещается в строку 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
рассматривается как конкатенация no 4 и no 5, что приводит к 10.1