Я только что столкнулся с небольшим фрагментом 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