Недавно я создал ответ на 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()