Почему унарные операторы в PHP работают неочевидно?
Меня сложно чем-то удивить, но вот пример с PHP 8.3 заставляет задуматься:
$a = 100; // = 100
$b = -$a; // = -100
$c = +$b; // = -100Возникает вопрос: разве в PHP нет унарных операций? А здесь будто бы они есть, но только в одну сторону... Как это работает и почему?
На самом деле, унарные операторы + и - в PHP существуют и выполняют следующие действия:
- Унарный минус (
-) - меняет знак числа на противоположный (отрицательный). - Унарный плюс (
+) - не меняет знак, но может приводить операнд к числовому типу (например, строку в число).
В вашем примере: $b = -$a даёт -100. Затем $c = +$b применяет унарный плюс к отрицательному числу, поэтому $c остаётся -100. Унарный плюс не превращает отрицательное число в положительное - для этого нужно использовать функцию abs(). Таким образом, поведение полностью соответствует спецификации PHP.