PHP конкатенация строк и арифметических операций
Я начал изучать PHP не так давно и столкнулся с этой проблемой:
<?php
$a = 1;
$b = 2;
echo "$a * $b = " . $a * $b;
echo "<br />";
echo "$a / $b = " . $a / $b;
echo "<br />";
echo "$a + $b = " . $a + $b;
echo "<br />";
echo "$a - $b = " . $a - $b;
echo "<br />";
Я получаю следующий вывод:
1 * 2 = 2
1 / 2 = 0.5
3
-1
Последние две строки в выводе не то, что я ожидал.
Почему это? Как оцениваются эти выражения? Я пытаюсь лучше понять язык.
3 ответа
Это происходит потому, что оператор конкатенации имеет более высокий приоритет, чем операторы сложения или вычитания, но умножение и деление имеют более высокий приоритет, чем конкатенация.
Итак, что вы действительно выполняете это:
echo ("$a + $b = " . $a) + $b;
echo ("$a - $b = " . $a) - $b;
В первом случае это превращается в это:
"1 + 2 = 1" + $b
Какой PHP пытается конвертировать "1 + 2 = 1"
в число (из-за типа жонглирования) и получает 1, превращая выражение в:
1 + 2
Вот почему вы получаете 3. Та же логика может быть применена к условию вычитания.
Вместо этого, если вы поставите скобки вокруг расчетов, вы получите желаемый результат.
echo "$a + $b = " . ($a + $b);
echo "$a - $b = " . ($a - $b);
Конкатенация имеет приоритет над сложением и вычитанием, но не умножением или делением. Так
echo "$a + $b = " . $a + $b;
эквивалентно
echo ("$a + $b = " . $a) + $b;
И PHP игнорирует первую часть, так как трудно преобразовать ее в число, оставляя вам только + $b
,
Если вы используете скобки, у вас все будет хорошо.
Ну, вы нашли действительно странное поведение, но:)
Исходя из арифметических операторов, деление и умножение имеют наивысший приоритет, поэтому они оцениваются перед объединением.
Хотя сложение и извлечение имеют более низкий приоритет, сначала оценивается левая часть, а затем добавляется / извлекается в правую часть. Но PHP пытается извлечь числовое значение из строки, и только первый символ является таковым, поэтому он делает это с ним.