Estructuras de Control

Zephir implementa un conjunto simplificado de estructuras de control presentes en lenguajes similares como C, PHP, etc.

Condicionales

Declaración If

if statements evaluate an expression, executing the following block if the evaluation is true. Las llaves son obligatorias. Un if puede tener un else opcional y múltiples construcciones if/else se pueden encadenar juntas:

if false {
    echo "¿falso?";
} else {
    if true {
        echo "¡verdadero!";
    } else {
        echo "ni verdadero ni falso";
    }
}

Las declaraciones elseif también están disponibles:

if a > 100 {
    echo "muy grande";
} elseif a < 0 {
    echo "muy pequeño";
} elseif a == 50 {
    echo "¡perfecto!";
} else {
    echo "ok";
}

Los paréntesis en la expresión evaluada son opcionales:

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

Declaración Switch

Un switch evalúa una expresión contra una serie de valores literales predefinidos, ejecutando los correspondientes bloques case o en caso contrario, finalizando en default:

switch count(items) {

    case 1:
    case 3:
        echo "impares";
        break;

    case 2:
    case 4:
        echo "pares";
        break;

    default:
        echo "desconocido";
}

Bucles

Declaración While

while denotes a loop that iterates as long as its given condition evaluates as true:

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

Declaración Loop

Además de while, loop puede ser utilizado para crear bucles infinitos:

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

Declaración For

for es una estructura de control que permite recorrer matrices o cadenas de texto:

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

Las claves hash se pueden obtener proporcionando una variable tanto para la clave como para el valor:

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

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

Un bucle for también puede ser utilizado para recorrer una matriz o cadena de texto en orden inverso:

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

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

Un bucle for también puede utilizarse para recorrer cadenas de texto:

string language = "zephir"; char ch;

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

En orden inverso:

string language = "zephir"; char ch;

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

Un for estandar, que recorre un rango de valores enteros, se puede escribir de la siguiente manera:

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

Para evitar avisos sobre variables no utilizadas, es posible utilizar variables anónimas en las declaraciones for, reemplazando el nombre de una variable por el marcador _:

Utilizar las claves pero ignorar los valores
for key, _ in data {
    echo key, "\n";
}

Declaración Break

Un break termina con la ejecución actual de una declaración while, for o loop:

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

Declaración Continue

El continue se usa dentro de las estructuras de bucle para omitir el resto de la iteración del bucle actual y continuar la ejecución en la evaluación de condición, y luego al comienzo de la siguiente iteración.

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

Require

La declaración require incluye dinámicamente y evalúa un archivo especifico de PHP. Tenga en cuenta que estos archivos incluidos por Zephir son interpretados por el Zend Engine como un archivo normal de PHP. require does not allow Zephir code to include other Zephir files at runtime.

if file_exists(path) {
    require path;
}

Let

La declaración let es utilizada para mutar variables, propiedades y arrays. Las variables, por defecto, son inmutables y esta instrucción les hace mutables por la duración de la declaración:

let name = "Tony";           // variable simple
let this->name = "Tony";     // propiedad de un objecto
let data["name"] = "Tony";   // índice de un array
let self::_name = "Tony";    // propiedad estática

Además esta instrucción debe ser utilizada para incrementar/disminuir variables:

let number++;           // incrementar una variable simple
let number--;           // disminuir una variable simple
let this->number++;     // incrementar una propiedad de un objecto
let this->number--;     // disminuir una propiedad de un objecto

Varias mutaciones pueden ser realizadas en una sola operación let:

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