Приоритет оператора concat и идентификатора float '.' (T_CONSTANT_ENCAPSED_STRING, T_DNUMBER)

Недавно я создал ответ на SO, и я узнал, что я считаю странным поведением в PHP, чего я никогда не замечал из-за моего (следующего) стиля кодирования:

$var = 1; echo "test string ". $var+1 ." example"; 

Это прекрасно работает, однако, если я удалю пробел между 1 и . :

 echo "test string ". $var+1." example"; 

Он даст мне T_CONSTANT_ENCAPSED_STRING разбора T_CONSTANT_ENCAPSED_STRING и в этом случае ожидает ',' или ';' что совершенно неверно.

И да .. это будет работать так:

 echo "test string ".($var+1)." example"; 

Проблема, с которой я сталкиваюсь, заключается в том, что сообщение об ошибке состоит в том, что оно не отражает основную проблему того, что конкретно хочет, где большинство других сообщений прямолинейно и правильно.

Хотя изначально я не ожидал, что плавающие точки станут причиной этого, мне все же трудно понять, почему оператор float имеет приоритет над оператором concat в следующем сценарии:

 var_dump( .1, 1, 1., 1.0); var_dump( 1.."a", "a"..1, 1.0."a"); 

float (0.1), int (1), float (1), float (1)
строка (2) "1a", строка (4) "a0.1", строка (2) "1a"

Теперь я понимаю, что арифметические операторы должны идти перед строковыми операциями, но вот часть, которую я просто не получаю:

".1 и 1." должен указать это . является оператором concat и 1.1 должен указывать это . является идентификатором для float. Вместо этого они оба дают ошибки разбора.

PHP – это язык, который не придирчив к переменным типам:

 var_dump(1 + 1.); // float(2) var_dump(1. + 1); // float(2) 

Вы можете просто использовать + 1 чтобы добавить к float, зачем разбирать 1. как поплавок? Ошибка синтаксического разбора возникает в следующем токене, в котором он ожидает цифру и даже не позволяет ей быть оператором concat.

Поэтому мой вопрос: почему PHP lexer бросает так много внимания на идентификацию float и если echo 1."test" будет выводить 1test может ли он сломать существующий в настоящее время код?

Я отредактировал вопрос, чтобы прояснить, что я имел в виду, в первую очередь из-за негативного репутации, который я получал. Текущий принятый ответ по-прежнему очень важен, потому что мне нужен способ проверить php-код, не используя eval()