В случае, если вы сравниваете число со строкой или две строки, содержащие числа, каждая строка будет преобразована в число, и сравниваться они будут как числа.
| null или string | string | NULL преобразуется в "", числовое или лексическое сравнение |
| bool или null | что угодно | Преобразуется в bool, FALSE <TRUE|
| object | object | Встроенные классы могут определять свои собственные правила сравнения, объекты разных классов не сравниваются, объекты одного класса - сравниваются свойства тем же способом, что и в массивах |
| string или number | string или number | Строки переводятся в числа, обычная математика |
| array | array | Массивы с меньшим числом элементов считаются меньше, если ключ из первого операнда не найден во втором операнде - массивы не могут сравниваться, иначе идет сравнение соответствующих значений |
*`$a | $b` - битовое ИЛИ, устанавливаются те биты, которые установлены в `$a` или в `$b`.
*`$a & $b` - битовое И, устанавливаются только те биты, которые установлены и в `$a`, и в `$b`.
*`$a ^ $b` - битовое исключающее ИЛИ, устанавливаются только те биты, которые установлены либо только в `$a`, либо только в `$b`, но не в обоих одновременно.
*`~$a` - битовое отрицание, устанавливаются те биты, которые не установлены в `$a`, и наоборот.
*`$a << $b` - битовый сдвиг влево, все биты переменной `$a` сдвигаются на `$b` позиций влево (каждая позиция подразумевает "умножение на 2")
*`$a >> $b` - битовый сдвиг вправо, все биты переменной `$a` сдвигаются на `$b` позиций вправо (каждая позиция подразумевает "деление на 2")
Fenom поддерживает префиксные и постфиксные операторы инкремента и декремента в стиле PHP или C.
**Замечание:**
Операторы инкремента/декремента не влияют на булевы значения. Декремент NULL также не даст никакого эффекта, однако инкремент даст значение 1.
*`++$a` - префиксный инкремент, увеличивает $a на единицу, затем возвращает значение $a.
*`$a++` - постфиксный инкремент, возвращает значение $a, затем увеличивает $a на единицу.
*`--$a` - префиксный декремент, уменьшает $a на единицу, затем возвращает значение $a.
*`$a--` - постфиксный декремент, возвращает значение $a, затем уменьшает $a на единицу.
### Строковый оператор
Оператор конкатенации `~` возвращает строку, представляющую собой соединение левого и правого аргумента.
`$a ~ $b` - возвращает результат объединения сток `$a` и `$b`
### Тернарные операторы
Еще одним условным оператором являются тернарные операторы `?:` и `!:`.
Выражения `(expr1) ? (expr2) : (expr3)` и `(expr1) ! (expr2) : (expr3)` интерпретируется как `expr2`, если `expr1` имеет значение TRUE, или как `expr3` если `expr1` имеет значение FALSE.
Тернарый оператор `?:` проверяет условие `expr1` на не "пустое" значение, то есть `expr1` при конвертирование в булевое значение должен вернуть TRUE.
Следующие значения воспринимаются как пустые:
* "" (пустая строка)
* 0 (целое число)
* 0.0 (дробное число)
* "0" (строка)
* NULL
* FALSE
* array() (пустой массив)
* переменная не объявлена
* элемента массива не существует
* свойство объекта не существует
```smarty
{$request.action ? $request.action : 'default'}
```
Пример выше стоит интерпретировать так: если `$request.action` не пустое то вернуть `$request.action` иначе вернуть `default`.
Приведенный пример можно записать в упрощенном формате:
Пример выше стоит интерпретировать так: если переменна я `$request` существует, является массивом и существует ключ `$request.action` то вернуть `$request.action` иначе вернуть `default`.
Приведенный пример можно записать в упрощенном формате: