2012-08-16 3 views
6

я начал изучать 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 

Последние две строки результат не то, что я ожидал бы.

Почему это? Как оцениваются эти выражения? Я пытаюсь лучше понять язык.

+0

В качестве общего руководства вы, вероятно, не должны полагаться на слабое типирование PHP в любом случае. –

ответ

8

Это происходит потому, что оператор конкатенации имеет higher precedence, чем операторы сложения или вычитания, но умножение и деление имеют более высокий приоритет, чем конкатенация.

Итак, что вы на самом деле выполнения заключается в следующем:

echo ("$a + $b = " . $a) + $b; 
echo ("$a - $b = " . $a) - $b; 

В первом случае, который получает превратился в это:

"1 + 2 = 1" + $b 

Какой PHP пытается преобразовать "1 + 2 = 1" в ряд (из-за type juggling) и получает 1, превращая выражение в:

1 + 2 

Whic h - то, почему вы получаете 3. Та же логика может быть применена к условию вычитания.

Вместо этого, если вы разместите скобки вокруг вычислений, вы получите желаемый результат.

echo "$a + $b = " . ($a + $b); 
echo "$a - $b = " . ($a - $b); 
+2

Другим решением является не конкатенация, а использование нескольких аргументов в вызове эха. 'echo '$ a + $ b =", $ a + $ b; ' –

+0

@RobertK или [' printf() '] (http: // php.net/printf) – Wiseguy

+0

Мне всегда казалось, что я действительно нелогичен, чтобы дать половине операторов более высокий приоритет, чем конкатенация, а половина из них - более низкий приоритет ... Кто-нибудь знает, почему это так? Это просто плохой дизайн или есть причина для этого? – user3640967

1

Конкатенация имеет преимущество перед сложениями и вычитанием, но не умножением или делением. Так

echo "$a + $b = " . $a + $b; 

эквивалентно

echo ("$a + $b = " . $a) + $b; 

И PHP пренебрегает первую часть, так как трудно преобразовать его в ряд, оставив вас с только + $b.

Если вы используете круглые скобки, вы должны быть в порядке.

0

Ну, вы нашли действительно странное поведение, но :)

Из арифметической операторов, деления и умножения имеют наивысший приоритет, поэтому они оцениваются до конкатенации.

В то время как добавление и извлечение имеют более низкий приоритет, поэтому сначала обрабатывается левая часть, а затем добавляется/извлекается в правую часть. Но PHP пытается извлечь числовое значение из строки, и только первый символ таков, поэтому он делает это с ним.