2.7 Операции PHP

Арифметические операции
Перечислим их:
a + b — сложение;
a – b — вычитание;
a * b — умножение;
a / b — деление;
a % b — остаток от деления a на b;
a ** b — возведение a в степень b .
Операция деления / возвращает целое число (т. е. результат деления нацело), если оба выражения a и b — целого типа (или же строки, выглядящие как целые числа), в противном случае результат будет дробным. Операция вычисления остатка от деления % работает только с целыми числами, так что применение ее к дробным числам может привести, мягко говоря, к нежелательному результату. Оператор возведения в степень
был введен, начиная с версии PHP 5.6, и допускает, в том числе, дробный аргумент степени. Это позволяет не только возводить числа в целую степень, но и, например, извлекать квадратный корень.
echo 2 ** 0.5; // 1.4142135623731

Строковые операции
К ним относятся:
 a.b — слияние строк a и b;
 a[n] — символ строки в позиции n.
Собственно, других строковых операций и нет — все остальное, что можно сделать со строками в PHP, выполняют стандартные функции (вроде strlen(), substr() и т. д. — мы будем их все подробно рассматривать в главе 13).

Операции присваивания
Основным из этой группы операций является оператор присваивания =. Еще раз напомним, что он не обозначает “равенство”, а говорит интерпретатору, что значение правого выражения должно быть присвоено переменной слева. Например:
$a = ($b = 4) + 5;
После этого $a равно 9, а $b равно 4.
Помимо этого основного оператора существует еще множество комбинированных — по одному на каждую арифметическую, строковую и битовую операцию. (Большинство из них позаимствовано из C.) Например:
$n = 6;
$n += 1; // прибавить 1 к $n
$message = “Woken”;
$message .= ” up $n times!”; // теперь в $message “Woken up 7 times!”

Операции инкремента и декремента
Для операций $a += 1 и $b -= 1 в связи с их чрезвычайной распространенностью в PHP ввели, как и в C, специальные операторы:
$a++ — увеличение переменной $a на 1;
$a– — уменьшение переменной $a на 1.
Как и в языке C, эти операторы увеличивают или уменьшают значение переменной, а в выражении возвращают значение переменной $a до изменения. Например:
$a = 10;
$b = $a++;
echo “a = $a, b = $b”; // выведет a = 11, b = 10
Как видите, сначала переменной $b присвоилось значение переменной $a, а уж затем последняя была инкрементирована. Впрочем, выражение, значение которого присваивается переменной $b, может быть и сложнее — в любом случае, инкремент $a произойдет только после его вычисления. Существуют также парные рассмотренным операторы, которые указываются до, а не после имени переменной. Соответственно, и возвращают они значение переменной уже после изменения. Вот пример:
$a = 10;
$b = –$a;
echo “a = $a, b = $b”; // выведет a = 9, b = 9
Операторы инкремента и декремента на практике применяются очень часто. Например, они встречаются практически в любом цикле for.

Операции сравнения
Это в своем роде уникальные операции, потому что независимо от типов своих аргументов они всегда возвращают одно из двух значений: false или true. Операции сравнения позволяют сравнивать два значения между собой и, если условие выполнено, возвращают true, в противном случае — false.
Итак:
a == b — истина, если a равно b;
a != b — истина, если a не равно b;
a === b — истина, если a эквивалентно b;
a !== b — истина, если a не эквивалентно b;
a < b — истина, если a меньше b;
a > b — истина, если a больше b;
a <= b — истина, если a меньше либо равно b;
a >= b — истина, если a больше либо равно b;
a <=> b — возвращает –1, если a меньше b, 0, если a равно b и 1, если a больше b.

Особенности операторов == и !=
При использовании операций сравнения ключевые слова false и true — не совсем обычные константы. Раньше мы говорили, что false является просто синонимом для пустой строки, а true — для единицы. Именно так они выглядят, если написать следующие операторы:
echo false; // выводит пустую строку, т. е. ничего не выводит
echo true; // выводит 1
Теперь давайте рассмотрим программу

<?php ## Логические переменные
$hundred = 100;
if ($hundred == 1) echo “хм, странно… переменная равна 1!<br />”;
if ($hundred == true) echo “переменная истинна!<br />”;
?>

Запустив сценарий, вы увидите, что отображается только вторая строка! Выходит, не все так просто: с точки зрения PHP константа 1 и значение true не идентичны. Мы видим, что в операторах сравнения (на равенство ==, а также на неравенство !=) PHP интерпретирует один из операндов как логический, если другой — логический исходно. Иными словами, сравнивая что-то с true или false явно, мы всегда имеем в виду логическое сравнение, так что 100 == true, а 0 == false.
Но это еще не все. Вы будете, возможно, удивлены, что следующая команда:
if (“” == 0) echo “совпадение!”;
печатает слово “совпадение!”, хотя мы сравниваем пустую строку с нулем, а они, очевидно, никак не равны в обычном смысле! Мы приходим ко второму правилу: если один из операндов оператора сравнения числовой, то сравнение всегда выполняется в числовом контексте, даже если второй операнд — не число.
Запустим теперь такой код:
if (“Universe” == 0) echo “совпадение!”;
Мы с удивлением обнаружим, что программа печатает “совпадение!”. Это происходит как раз благодаря предыдущему правилу: 0 — число, а значит, оператор == трактует свои аргументы в целочисленном контексте. Иными словами, код выглядит для PHP так:
if (((int)”Universe”) == 0) echo “совпадение!”;
Когда PHP преобразует “нечисловую” строку в число, он всегда получает ответ 0. А значит, (int)”Universe” == 0, и сравнение срабатывает. Будьте внимательны!

Оператор <=>
В PHP 7 появился новый оператор <=>, который реализует сравнение переменных в механизмах поиска. Функция usort() подробнее описывается в главе 14. Старый стиль использования функции предполагает, что вы пишете функцию обратного вызова cmp(), которая сравнивает два числа $a и $b, возвращая 0, если числа равны, –1, если $a меньше $b, и 1, если $a больше $b.
<?php
function cmp ($a, $b)
{
if ($a == $b) return 0;
if ($a < $b) return -1;
if ($a > $b) return 1;
}
$arr = array(3, 1, 7, 6, 9, 4);
usort($arr, ‘cmp’);
print_r($arr); // 1, 3, 4, 6, 7, 9
?>
С использованием оператора <=> и анонимной функции приведенный выше пример можно переписать гораздо короче
<?php
$arr = array(3, 1, 7, 6, 9, 4);
usort($arr, function($a, $b) { return $a <=> $b; });
print_r($arr); // 1, 3, 4, 6, 7, 9
?>

Логические операции
Эти операции предназначены исключительно для работы с логическими выражениями и также возвращают false или true:
! a — истина, если a ложно, и наоборот;
a && b — истина, если истинны и a, и b;
a || b — истина, если истинны или a, или b, или оба операнда.
Следует заметить, что вычисление логических выражений, содержащих такие операции, идет всегда слева направо, при этом если результат уже очевиден (например, false && что-то всегда дает false), то вычисления обрываются, даже если в выражении присутствуют вызовы функций. Например, в операторе
$logic = 0 && (time() > 100);
стандартная функция time() никогда не будет вызвана. Будьте осторожны с логическими операциями — не забывайте про удвоение символа. Обратите внимание, что, например, | и || — два совершенно разных оператора, первый из которых может потенциально возвращать любое число, а второй — только false и true.
Для операторов && и || существуют аналогичные операторы and и or, которые отличаются только более низким приоритетом, что позволяет не заключать в скобки выражения справа и слева от оператора.

Условные операции
РНР так же, как и любой С-подобный язык, предоставляет условный оператор, который возвращает y, в случае если x принимает значение true, и z в случае, если x принимает значение false
x ? y : z
Классическим примером условной операции является получение абсолютного значения переменной.
<?php
$x = -17;
$x = $x < 0 ? -$x : $x;
echo $x; // 17
?>
Если переменная $x оказывается меньше нуля — у нее меняется знак, если переменная оказывается больше нуля, она возвращается без изменений. Допускается не указывать средний параметр условного оператора. Такой синтаксис позволяет в одну строку проверять, инициализирована ли переменная, и если она не инициализирована, присваивать ей начальное значение. В листинге 7.9 проверяется, имеет ли переменная $x значение, отличное от 0, null, пустой строки (и вообще всего, что может рассматриваться как false). Если переменная инициализирована — ее значение остается неизменным, если нет — ей присваивается единица.
<?php
$x = $x ?: 1;
echo $x; // 1
?>
Как видно из предыдущего раздела, в PHP довольно часто приходится проверять, существует та или иная переменная, установлено ли значение массива. Мы бы могли воспользоваться конструкцией ?: для того, чтобы проверить, существует ли нужный нам элемент массива:
if ($_REQUEST[“doGo”] ?: false) echo “Кнопка нажата!”;
Однако оператор ?: не проверяет, существует ли переменная, указанная в качестве его первого операнда. Поэтому выражение выше выдаст замечание о том, что элемент $_REQUEST[“doGo”] не существует. Корректное выражение выглядит следующим образом:
if (isset($_REQUEST[“doGo”]) ?: false) echo “Кнопка нажата!”;
Мы воспользовались формой ?:, т. к. нам фактически не требуется значение $_REQUEST[“doGo”]. Для того чтобы извлечь $_REQUEST[“doGo”], пришлось бы воспользоваться еще более длинной формой:
$val = isset($_REQUEST[“doGo”]) ? $_REQUEST[“doGo”] : false;
Переменная $val получит либо значение $_REQUEST[“doGo”], либо false, если
$_REQUEST[“doGo”] не существует. Для того чтобы сделать такие проверки более компактными, в PHP 7 был введен дополнительный оператор ??. Принимая два операнда, он возвращает значение элемента не равного null, при этом оператор автоматически проверяет на существование выражения и не генерирует замечание в случае отсутствия одного из них:

<?php ## Оператор ??
$x = null;
$y = null;
$z = 3;
var_dump($x ?? $y ?? $z); // int(3)
?>
Теперь выражение для получения значения $_REQUEST[“doGo”] можно записать в более компактной форме:
$val = $_REQUEST[“doGo”] ?? false;

Мы научились оперировать основными элементами любой программы на PHP — выражениями. Узнали, что некоторые операции сильно изменяют свое поведение, если их выполняют не с обычными, а с логическими переменными или с переменными, которые могут быть трактованы как логические. Мы выяснили, что понятия
“равно” и “эквивалентно” для PHP сильно различаются. Также был рассмотрен полезный оператор отключения предупреждений @ и изучены ситуации, в которых его применение не рекомендовано. Кроме того, мы познакомились с двумя новыми операторами — <=> и ??, которые были введены в PHP 7.

Залишити відповідь