Управляющие структуры

Zephir реализует упрощенный набор управляющих структур, присутствующих в подобных ему языках, таких как C, PHP и т.п.

Условные операторы

Оператор if

Условный оператор if реализует выполнение своего блока при условии, что некоторое логическое выражение (условие) принимает значение «истина» (true). Фигурные скобки обязательны. Оператор if может иметь необязательное предложение else. При необходимости, несколько конструкций if/else могут быть соединены вместе:

if false {
    echo "ложь?";
} else {
    if true {
        echo "истина!";
    } else {
        echo "ни истина и ни ложь";
    }
}

Вы также можете использовать elseif:

if a > 100 {
    echo "Значение a слишком большое";
} elseif a < 0 {
    echo "Значение a слишком маленькое";
} elseif a == 50 {
    echo "Превосходно!";
} else {
    echo "Хорошо";
}

Скобки в оцениваемом выражении необязательны:

if a < 0 { return -1; } else { if a > 0 { return 1; } }

Оператор switch

switch вычисляет выражение по ряду предопределенных литералов (буквальных значений), выполняя соответствующий блок case или в случае неудачи, выполняет блок default:

switch count(items) {

    case 1:
    case 3:
        echo "odd items";
        break;

    case 2:
    case 4:
        echo "even items";
        break;

    default:
        echo "unknown items";
}

Циклы

Цикл while

while обозначает цикл, который повторяется до тех пор, пока его заданное условие оценивается как true:

let counter = 5;
while counter {
    let counter -= 1;
}

Цикл loop

В дополнение к while , loop может использоваться для создания бесконечных циклов:

let n = 40;
loop {
    let n -= 2;
    if n % 5 == 0 { break; }
    echo x, "\n";
}

Цикл for

Цикл for является управляющей структурой, которая позволяет обходить массивы или строки:

for item in ["a", "b", "c", "d"] {
    echo item, "\n";
}

Для доступа к ключам хешей, используется дополнительная переменная, как показано ниже:

let items = ["a": 1, "b": 2, "c": 3, "d": 4];

for key, value in items {
    echo key, " ", value, "\n";
}

Цикл for также может быть использован для перемещения по массиву или строке в обратном порядке:

let items = [1, 2, 3, 4, 5];

for value in reverse items {
    echo value, "\n";
}

Цикл for может использоваться для обхода строковых переменных:

string language = "zephir"; char ch;

for ch in language {
    echo "[", ch ,"]";
}

В обратном порядке:

string language = "zephir"; char ch;

for ch in reverse language {
    echo "[", ch ,"]";
}

Стандартный цикл for для обхода диапазона целых значений может быть записан следующим образом:

for i in range(1, 10) {
    echo i, "\n";
}

Чтобы избежать предупреждений о неиспользуемых переменных, вы можете использовать анонимные переменные в операторах for, заменив имя переменной меткой _:

Использование ключа, но игнорирование значения
for key, _ in data {
    echo key, "\n";
}

Оператор break

break завершает выполнение текущего оператора while, for или loop:

for item in ["a", "b", "c", "d"] {
    if item == "c" {
        break; // exit the for
    }
    echo item, "\n";
}

Оператор continue

continue используется внутри структур цикла для реализации пропуска оставшейся части итерации текущего цикла, продолжения выполнения после оценки состояния и перехода к началу следующей итерации.

let a = 5;
while a > 0 {
    let a--;
    if a == 3 {
        continue;
    }
    echo a, "\n";
}

Оператор require

Инструкция require динамически включает и выполняет указанный PHP-файл. Обратите внимание, что файлы, включенные в Zephir, интерпретируются Zend Engine как обычные PHP-файлы. require не позволяет включать другие файлы Zephir во время выполнения.

if file_exists(path) {
    require path;
}

Оператор let

Выражение let используется для изменения переменных, свойств и массивов. Переменные по умолчанию неизменяемы, и эта инструкция делает их изменяемыми на протяжении всего утверждения:

let name = "Tony";           // простая переменная
let this->name = "Tony";     // свойство объекта
let data["name"] = "Tony";   // индекс массива
let self::_name = "Tony";    // статическое свойство

Также эта инструкция используется для операций инкремента и декремента:

let number++;           // инкремент простой переменной
let number--;           // декремент простой переменной
let this->number++;     // инкремент ствойства объекта
let this->number--;     // декремент свойства объекта

Множественные изменения могут быть выполнены в одной операции let:

let price = 1.00, realPrice = price, status = false;