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 пытается извлечь числовое значение из строки, и только первый символ является таковым, поэтому он делает это с ним.

Другие вопросы по тегам