Арифметическая операция в конкатенации строк без скобок приводит к странному результату - PullRequest
4 голосов
/ 27 сентября 2011

Рассмотрим следующую строку кода:

<?php
$x = 10;
$y = 7;

echo '10 - 7 = '.$x-$y;
?>

Выходное значение равно 3, что является ожидаемым результатом вычисления $ x- $ y. Тем не менее, ожидаемый результат:

10 - 7 = 3

Поэтому мой вопрос: что случилось со строкой, которую я объединяю с вычислением? Я знаю, что для получения ожидаемого результата мне нужно заключить арифметическую операцию в круглые скобки:

<?php
$x = 10;
$y = 7;

echo '10 - 7 = '.($x-$y);
?>

выходы

10 - 7 = 3

Но так как PHP не жалуется на оригинальный код, мне интересно, какова логика в этом случае? Куда делась струна? Если кто-то может объяснить это или указать мне место в руководстве по PHP, где это объясняется, я был бы благодарен.

Ответы [ 3 ]

4 голосов
/ 27 сентября 2011

В этом коде:

echo '10 - 7 = '.$x-$y;

Конкатенация имеет приоритет, так что у вас осталось следующее:

echo '10 - 7 = 10'-$y;

Поскольку он пытается выполнить целочисленное вычитание со строкой, строка сначала преобразуется в целое число, поэтому у вас остается что-то вроде этого:

echo (int)'10 - 7 = 10'-$y;

Целочисленное значение этой строки равно 10, поэтому результирующая арифметика выглядит следующим образом:

echo 10-$y;

Поскольку $y равно 7, а 10 - 7 = 3, отображаемый результат равен 3.

4 голосов
/ 27 сентября 2011

Ваша строка '10 - 7 = ' объединяется с $x. Затем это интерпретируется как int, что приводит к 10, а затем 7 вычитается, что приводит к 3.

Для более подробного объяснения, попробуйте это:

echo (int) ('10 - 7 = ' . 10); // Prints "10"

Более подробную информацию о преобразовании строки в число можно найти по адресу http://www.php.net/manual/en/language.types.string.php#language.types.string.conversion

Если строка начинается с допустимых числовых данных, это будет используемое значение

2 голосов
/ 27 сентября 2011

. и - имеют одинаковый приоритет , поэтому PHP переосмысливает '10 - 7 = 10' как число, давая 10, а вычитая 7 дает 3.

...