17 KiB
Операторы
Арифметические операторы
Все же помнят арифметику?
-$a- отрицание знака, смена знака$a.$a + $b- сложение, сумма$aи$b.$a - $b- вычитаение, разность$aи$b.$a * $b- умножение, произведение$aи$b.$a / $b- деление, частное от деления$aна$b.$a % $b- деление по модулю, целочисленный остаток от деления$aна$b.
{$a + $b * $c/$d - $e*5 + 1e3}
Логические операторы
$a || $b- логичесое ИЛИ, TRUE если или$a, или$bTRUE.$a && $b- лигическое И, TRUE если и$a, и$bTRUE.!$a- отрицание, TRUE если$aне TRUE.$a or $b- логическое ИЛИ, TRUE если или$a, или$bTRUE.$a and $b- логическое И, TRUE если и$a, и$bTRUE.$a xor $b- исключающее или, TRUE если$a, или$bTRUE, но не оба.
{if $b && $c} ... {/if}
Смысл двух разных вариантов для операторов and и or в том, что они работают с различными приоритетами.
Операторы сравнения
Операторы сравнения, как это видно из их названия, позволяют сравнивать между собой два значения.
$a < $b- меньше, TRUE если$aстрого меньше$b.$a > $b- больше, TRUE если$aстрого больше$b.$a <= $b- меньше или равно, TRUE если$aменьше или равно$b.$a >= $b- больше или равно, TRUE если$aбольше или равно$b.$a == $b- равно, TRUE если$aравно$bпосле преобразования типов.$a === $b- тождественно равно, TRUE если$aравно$bи имеет тот же тип.$a !== $b- тождественно не равно, TRUE если$aне равно$bили они разных типов.$a != $b- не равно, TRUE если$aне равно$bпосле преобразования типов.$a <> $b- не равно, TRUE если$aне равно$bпосле преобразования типов.
{if $b >= 5} ... {/if}
В случае, если вы сравниваете число со строкой или две строки, содержащие числа, каждая строка будет преобразована в число, и сравниваться они будут как числа.
{if 0 == "a"} {* 0 == 0 -> true *} {/if}
{if "1" == "01"} {* 1 == 1 -> true *} {/if}
{if "10" == "1e1"} {* 10 == 10 -> true *} {/if}
{if 100 == "1e2"} {* 100 == 100 -> true *} {/if}
Преобразование типов не происходит при использовании === или !== так как в этом случае кроме самих значений сравниваются еще и типы.
Таблица сравнения различных типов:
| Тип операнда 1 | Тип операнда 2 | Результат |
|---|---|---|
| null или string | string | NULL преобразуется в "", числовое или лексическое сравнение |
| bool или null | что угодно | Преобразуется в bool, FALSE < TRUE |
| object | object | Встроенные классы могут определять свои собственные правила сравнения, объекты разных классов не сравниваются, объекты одного класса - сравниваются свойства тем же способом, что и в массивах |
| string или number | string или number | Строки переводятся в числа, обычная математика |
| array | array | Массивы с меньшим числом элементов считаются меньше, если ключ из первого операнда не найден во втором операнде - массивы не могут сравниваться, иначе идет сравнение соответствующих значений |
| object | что угодно | object всегда больше |
| 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")
{if $a & 1} {var $b = 4 | $flags} {/if}
Оператор присваивания
Базовый оператор присваивания обозначается как =. На первый взгляд может показаться, что это оператор "равно".
На самом деле это не так. В действительности, оператор присваивания означает, что левый операнд получает значение правого выражения,
(т.е. устанавливается значением).
В дополнение к базовому оператору присваивания имеются "комбинированные операторы" для всех бинарных арифметических операций и строковых операций,
которые позволяют использовать некоторое значение в выражении, а затем установить его как результат данного выражения.
То есть выражение $a = $a + 2 может быть записано как $a += 2.
$a = $b- присвоение$a += $b- присвоение с добалением.$a -= $b- присвоение с вычитанием.$a *= $b- присвоение с умножением.$a /= $b- присвоение с делением.$a %= $b- присвоение с делением по модулю.$a &= $b- присвоение с битовыйм И.$a |= $b- присвоение с битовыйм ИЛИ.$a ^= $b- присвоение с битовыйм исключением ИЛИ$a <<= $b- присвоение с битовым сдвигом влево.$a >>= $b- присвоение с битовым сдвигом врпаво.
{var $b |= $flags}
Операторы инкремента и декремента
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() (пустой массив)
- переменная не объявлена
- элемента массива не существует
- свойство объекта не существует
{$request.action ? $request.action : 'default'}
Пример выше стоит интерпретировать так: если $request.action не пустое то вернуть $request.action иначе вернуть default.
Приведенный пример можно записать в упрощенном формате:
{$request.action ?: 'default'}
Тернарый оператор ?: проверяет условие expr1 на существование и относится больше к работе с переменными,
то есть переменная в выражении expr1 должна существовать даже если она "пустая", но не NULL.
Данный оператор не имеет значения если expr1 функция или метод, так как в этом случае всегда будет TRUE.
{$request.action ! $request.action : 'default'}
Пример выше стоит интерпретировать так: если переменна я $request существует, является массивом и существует ключ $request.action то вернуть $request.action иначе вернуть default.
Приведенный пример можно записать в упрощенном формате:
{$request.action !: 'default'}
Как видно, оператор :? более расширенный чем :! и включает в себя функциональность опертора !:.
Для упрощения понимания можно подвести итог:
$a ? $b : $c- вернет$bесли$aне пустое, иначе вернет$c.$a ! $b : $c- вернет$bесли$aсуществует, иначе вернет$c.$a ?: $c- вернет$aесли$aне пустое, иначе вернет$b.$a !: $c- вернет$aесли$aсуществует, иначе вернет$b.
{var $a = true}
{$a ? 5 : 10} {* вернет 5 *}
{var $a = false}
{$a ? 5 : 10} {* вернет 10 *}
Операторы проверки
Оператор проверки это упрощенный тернарный оператор от которого осталась только часть проверки без возвращаемых вариантов. Суть операторов — быстро произвести проверку на не пустое занчение и существование пременной.
$a?- вернетTRUEесли$aне пустое$a!- вернетTRUEесли$aсуществует
{if $a?} {* вместо {if !empty($a)} *}
{if $a!} {* вместо {if isset($a)} *}
Оператор тестирования
Оператор is производит тесты над перменными или выражением. Левый операнд считается тестируемым, а правый операнд — название теста:
{* проверка переменной на не четность *}
{$a is odd}
Результат тестирования может быть инвертирован с помощью is not оператора:
{* проверяем переменную что ее значение не явдяется числом *}
{$a is not integer}
Список допустимых тестов:
$a is integer- тестирует перменную на тип. Тестом может бытьint,integer— целое числоbool,boolean— булево значениеfloat,double,decimal- дробное числоarray— массивobject— объектscalar— скалярное значение (не массив и не объект)string— строкаcallback,callable— функцияnumber,numeric— число, в общем понимании
$a is iterable- тестирует переменную на возможность итеративного обхода.$a is template- переменная$aсодержит название существующего шаблона.$a is empty- переменная пустая.$a is set- переменная существует.$a is even- переменная$aимеет четное значение.$a is odd- переменная$aимеет не четное значение.$a is MyClassили$a is \MyClass- переменная$aявляется сущностью классаMyClass$a is $b-$aтождественна$b
Оператор присутствия
Оператор in проверяет присутвие скалярного значения слева в массиве или строке справа.
Результат тестирования может быть инвертирован с помощью not ni оператора.
$a in list $b- значение$aсодержится в массиве значений$b$a in keys $b- массив$bимеет ключ$a$a in string $b- значение$aсодержится в$bкак подстрока.$a in $b- значение$aсодержится в$b, где$bможет быть строкой, обычным или ассоциативным массивом. Этот вариант долгий так как требуется проверить типы переменной$b. Однако если вместо $b явно задан массив иили строка то оператор сам адаптируется для быстрого поиска.
{'df' in 'abcdefg'}
{5 in [1, 5, 25, 125]}
{99 in keys [1, 5, 25, 99 => 125]}