Tipos
Zephir es dinámica y estáticamente tipificado. En este capítulo se destacan los tipos soportados y sus comportamientos.
Tipos Dinámicos
Las variables dinámicas son exactamente como en PHP. Pueden ser asignados y reasignados a diferentes tipos sin restricción.
Una variable dinámica debe declararse con la palabra clave var
. El comportamiento es casi igual que en PHP:
var a, b, c;
Inicializar las variables
let a = "hola", b = false;
Cambiar sus valores
let a = "hola", b = false;
let a = 10, b = "140";
Realizar operaciones
let c = a + b;
Pueden tener ocho tipos:
Tipo | Descripción |
---|---|
array |
Un array, también puede llamarse arreglo o matriz, es un mapa ordenado. Un mapa es un tipo que asocia valores a claves. |
boolean |
Un valor booleano expresa un valor de verdad. Puede ser true o false . |
float /double |
Son números de punto flotante. El tamaño de un flotante depende de la plataforma. |
integer |
Son números enteros. El tamaño de un entero depende de la plataforma. |
null |
El valor especial NULL representa que la variable no tiene valor. |
object |
Abstracción de objectos como en PHP. |
resource |
Un recurso contiene una referencia a un recurso externo. |
string |
Es una cadena de texto o una serie de caracteres, donde un caracter es igual a un byte. |
Revisar por más de estos tipos en el manual de PHP.
Array
La implementación de los arreglos en Zephir es básicamente igual que en PHP: Mapas ordenados optimizados para varios usos diferentes; se puede tratar como un array, lista (vector), tabla hash (una implementación de un mapa), diccionario, colección, pila, cola y probablemente más. Como valores del array pueden ser otros arrays, árboles y también son posibles arrays multidimensionales.
La sintaxis para definir matrices es ligeramente diferente a PHP:
Deben utilizarse corchetes para definir matrices
let myArray = [1, 2, 3];
Deben utilizarse dos puntos “:” para definir claves hash
let myHash = ["first": 1, "second": 2, "third": 3];
Solo valores enteros y cadenas de textos pueden utilizados como claves:
let myHash = [0: "primero", 1: true, 2: null];
let myHash = ["primero": 7.0, "segundo": "una cadena", "tercero": false];
Boolean
Un valor booleano expresa un valor de verdad. Puede ser true
o false
:
var a = false, b = true;
Float/Double
Los números de punto flotante (también conocido como “flotantes”, “dobles” o “números reales”). Los literales de coma flotante son expresiones con uno o más dígitos, seguidos de un punto (.), seguido por uno o más dígitos. El tamaño de un flotante es dependiente de la plataforma, aunque un tamaño máximo de ~1.8e308 con una precisión de aproximadamente 14 dígitos decimales es un valor común (el formato IEEE de 64 bits).
var number = 5.0, b = 0.014;
Los números de punto flotante tienen una precisión limitada. Aunque depende del sistema, Zephir utiliza el mismo formato de doble precisión de IEEE 754 usado por PHP, que le dará un máximo error relativo por redondeo en el orden de 1.11e-16.
Integer
Son números enteros. El tamaño de un entero es dependiente de la plataforma, aunque un valor máximo aproximadamente de 2 billones es el valor usual (que es 32 bits con signo). Las plataformas de 64 bits generalmente tienen un valor máximo aproximadamente de 9E18. PHP no soporta enteros sin signo, Zephir también tiene esta restricción:
var a = 5, b = 10050;
Desbordamiento de Enteros
Contrario a PHP, Zephir no comprueba automáticamente el desborde de enteros. Como en C, si haces operaciones que pueden devolver un número grande, usted debe usar tipos como unsigned long
o float
para almacenarlos:
unsigned long my_number = 2147483648;
Object
Zephir permite crear, manipular, llamar métodos, leer constantes de clase, etcétera desde objetos PHP:
let myObject = new \stdClass(),
myObject->someProperty = "mi valor";
String
Un string
es una serie de caracteres, donde un caracter es igual a un byte. Como en PHP, Zephir solo soporta un conjunto de 256 caracteres y por lo tanto no ofrece un soporte nativo de Unicode.
var today = "Viernes";
En Zephir, los string literales solo pueden ser especificados utilizando las comillas dobles (como en C o Go). Las comillas simples están reservadas para los datos de tipo char
.
Son soportadas las siguientes secuencias de escape en cadenas de texto:
Secuencia | Descripción |
---|---|
\t |
Tab horizontal |
\n |
Salto de línea |
\r |
Retorno de carro |
\\ |
Barra invertida |
\" |
Comilla doble |
var today = "\tviernes\n\r",
tomorrow = "\tsábado";
En Zephir, los strings no soportan el analizis de variables como en PHP; es necesario utilizar la concatenación:
var name = "Pedro";
echo "hola: " . name;
Tipos Estáticos
El tipificado estático permite al programador declarar y utilizar algunos tipos de variables disponibles en C. Las variables no pueden cambiar su tipo una vez que se han declarado con un tipo estático. Sin embargo, permiten al compilador hacer un mejor trabajo de optimización. Son soportados los siguientes tipos:
Tipo | Descripción |
---|---|
array |
Una estructura que puede ser utilizada como hash, mapa, diccionario, colección, pila, etcétera. |
boolean |
Un valor booleano expresa un valor de verdad. Puede ser true o false . |
char |
Es la unidad más pequeña que puede contener el conjunto de caracteres básicos. |
float /double |
Tipo punto flotante de doble precisión. El tamaño depende de la plataforma. |
integer |
Enteros con signo. Al menos 16 bits de tamaño. |
long |
Tipo entero largo con signo. Al menos 32 bits de tamaño. |
string |
Es una cadena de texto o una serie de caracteres, donde un caracter es igual a un byte. |
unsigned char |
Mismo tamaño que un char , pero garantiza que sea sin signo. |
unsigned integer |
Enteros sin signo. Al menos 16 bits de tamaño. |
unsigned long |
Igual que long , pero sin signo. |
Boolean
Un boolean
expresa un valor de verdad. Puede ser true
o false
. Contrariamente al comportamiento dinámico detallado anteriormente, los tipos boolean
estáticos siguen siendo boolean
(true
o false
) sin importar el valor que se les asigne:
boolean a;
let a = true;
Automáticamente clasificado como true
let a = 100;
Automáticamente clasificado como false
let a = 0;
Arroja una excepción de compilador
let a = "hola";
Char/Char sin signo
las variables char
son la unidad direccionable más pequeña de la máquina que puede contener el conjunto de carácter básico (generalmente 8 bits). Una variable de tipo char
se puede utilizar para almacenar cualquier carácter en una cadena:
char ch, string name = "pedro";
almacenar ‘d’
let ch = name[2];
Los literales char
deben ser encerrados entre comillas simples
let ch = 'Z';
Integer/Integer sin signo
integer
values are like the integer
member in dynamic values. Values assigned to integer variables remain integer:
int a;
let a = 50,
a = -70;
Automáticamente clasificado a 100
let a = 100.25;
Automáticamente clasificado a 0
let a = null;
Automáticamente clasificado a 0
let a = false;
Arroja una excepción de compilador
let a = "hola";
Los unsigned integer
, son como los integer
pero no tienen signo, esto significa que no puede almacenar números negativos en este tipo de variables:
uint a;
let a = 50;
Automáticamente clasificado a 70
let a = -70;
Automáticamente clasificado a 100
let a = 100.25;
Automáticamente clasificado a 0
let a = null;
Automáticamente clasificado a 0
let a = false;
Arroja una excepción de compilador
let a = "hola";
Las variables unsigned integer
son dos veces más grandes que las variables integer
comunes. Asignando un unsigned integer
a un integer
(sin signo) puede resultar en perdida de datos:
Pérdida potencial de datos en b
uint a, int b;
let a = 2147483648,
b = a;
Long/Long sin signo
Las variables long
son dos veces más grandes que las variables integer
, por lo que pueden almacenar números más grandes. Al igual que con los integer
, los valores asignados a variables long
se convierten automáticamente a este tipo:
long a;
let a = 50,
a = -70;
Automáticamente clasificado a 100
let a = 100.25;
Automáticamente clasificado a 0
let a = null;
Automáticamente clasificado a 0
let a = false;
Arroja una excepción de compilador
let a = "hola";
Los unsigned long
son como los long
estándar, pero no tienen signo, esto significa que no puede almacenar números negativos en este tipo de variables:
ulong a;
let a = 50;
Automáticamente clasificado a 70
let a = -70;
Automáticamente clasificado a 100
let a = 100.25;
Automáticamente clasificado a 0
let a = null;
Automáticamente clasificado a 0
let a = false;
Arroja una excepción de compilador
let a = "hola";
Las variables unsigned long
son dos veces más grandes que las long
estándar; asignando unsigned long
a una estándar long
(con signo) puede causar la perdida de datos:
Pérdida potencial de datos en b
ulong a, long b;
let a = 4294967296,
b = a;
String
Es una cadena de texto o una serie de caracteres, donde un caracter es igual a un byte. Como PHP solo soporta un conjunto de 256 caracteres y por lo tanto no ofrece un soporte nativo de Unicode.
Cuando una variable es declarada como string
, nunca cambia su tipo:
string a;
let a = "";
Los string literales deben ser encerrados entre comillas dobles
let a = "hola";
Convertido a string “A”
let a = 'A';
Automáticamente clasificado a “”
let a = null;