математическая операция объединения строк в php - PullRequest
2 голосов
/ 01 февраля 2012
$a =  'hello' . 3 + 6 + 10;
echo $a; // 16

Я ожидаю, что это будет hello19, а не 16.

Я знаю, что могу поставить математическую операцию в ():

$a =  'hello' . (3 + 6 + 10);
echo $a; // hello19

Но почему php возвращает 16?

Спасибо заранее.

Ответы [ 4 ]

1 голос
/ 01 февраля 2012

В PHP оба . и + имеют равный приоритет и оба являются ассоциативными слева.

В результате

'hello' . 3 + 6 + 10;

оценивается как

('hello' . 3) + 6 + 10;

= 'hello3' + 6 + 10                           

= ('hello3' + 6) + 10 // String 'hello3' when interpreted as a number gives 0
                      // as it starts with a non-digit.

= 6 + 10

= 16
0 голосов
/ 01 февраля 2012

Следуя оператору PHP приоритет и ассоциативность , вы можете переписать ваше выражение в эквивалентное выражение следующим образом:

'hello' . 3 + 6 + 10;        <==>
('hello' . 3) + 6 + 10;      <==>
((('hello' . 3) + 6) + 10);

И если мы оценим это выражение, как PHP будет:

((('hello' . 3) + 6) + 10);  =
(('hello3' + 6) + 10);       =
((0 + 6) + 10));             =
(6 + 10);                    =
16
0 голосов
/ 01 февраля 2012

сначала посмотрите на это:

$a =  'hello' . 3;
echo (int)$a; //echoes 0

, потому что hello3 начинается с буквы, а не с цифры, и php преобразует ее в целое число в ноль.так что 0+6+10 очевидно 16.

второй код сначала вычисляет 3 + 6 + 10 в фигурных скобках и затем объединяет hello с результатом, равным 19

0 голосов
/ 01 февраля 2012

Это происходит потому, что 'hello' . 3 оценивается как 0, если за ним следует математическая операция +.

при использовании скобок сначала вычисляется сумма, а затем число преобразуется в строку и объединяется с 'hello'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...