$a = 'hello' . 3 + 6 + 10; echo $a; // 16
Я ожидаю, что это будет hello19, а не 16.
Я знаю, что могу поставить математическую операцию в ():
$a = 'hello' . (3 + 6 + 10); echo $a; // hello19
Но почему php возвращает 16?
Спасибо заранее.
В 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
Следуя оператору 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
сначала посмотрите на это:
$a = 'hello' . 3; echo (int)$a; //echoes 0
, потому что hello3 начинается с буквы, а не с цифры, и php преобразует ее в целое число в ноль.так что 0+6+10 очевидно 16.
hello3
0+6+10
второй код сначала вычисляет 3 + 6 + 10 в фигурных скобках и затем объединяет hello с результатом, равным 19
3 + 6 + 10
hello
Это происходит потому, что 'hello' . 3 оценивается как 0, если за ним следует математическая операция +.
hello' . 3
при использовании скобок сначала вычисляется сумма, а затем число преобразуется в строку и объединяется с 'hello'
'hello'