Почему унарные операторы в PHP работают неочевидно?

    Меня сложно чем-то удивить, но вот пример с PHP 8.3 заставляет задуматься:

    $a = 100;   // = 100
    $b = -$a;   // = -100
    $c = +$b;   // = -100

    Возникает вопрос: разве в PHP нет унарных операций? А здесь будто бы они есть, но только в одну сторону... Как это работает и почему?

    На самом деле, унарные операторы + и - в PHP существуют и выполняют следующие действия:

    • Унарный минус (-) - меняет знак числа на противоположный (отрицательный).
    • Унарный плюс (+) - не меняет знак, но может приводить операнд к числовому типу (например, строку в число).

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