Почему 1... 1 оценивается до 10.1?

Я только что столкнулся с небольшим фрагментом PHP из 3v4l: https://3v4l.org/jmrZB

echo 1...1; //10.1

И, боюсь, я понятия не имею, как объяснить его результаты. Почему это считается действительным вообще?

Ответ 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.

Ответ 2

Поскольку он интерпретируется как 1. . .1 (1 и 0.1), вы получаете 10.1

Ответ 3

Применение фигурных скобок даст понять:

(1.) . (.1)

  • 1. интерпретируется как 1
  • . - конкатенация строк
  • .1 интерпретируется как 0.1

Все это помещается в строку 10.1 в виде строки.

var_dump(1...1) дает string(4) "10.1"

Ответ 4

Различные операции.

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