Tipos de datos en PHP

PHP soporta varios tipos de datos, que podemos clasificar en dos categorías: escalares y compuestos. Los datos escalares son aquellos que sólo pueden contener un valor en un momento dado (las variables “normales”, para entendernos). Los datos compuestos son los que pueden tener dos o más valores en un mismo instante de tiempo (matrices y objetos).

Los datos escalares

Los datos escalares pueden ser de cuatro tipos fundamentales, recogidos en la tabla que vemos a continuación:

Tipos de datos escalares
Dato Tipo de valor
Int Un número entero con signo.
Float Un número fraccionario (en coma flotante) con signo.
String Una secuencia de datos binarios.
Booleano Un valor de tipo true o false (verdadero o falso).

PHP reconoce, como acabamos de ver en esta tabla, dos tipos de valores numéricos: los enteros y los fraccionarios, o en coma flotante. Una cosa que no debe olvidar es que los números fraccionarios emplean el punto como separador de decimales, y no existe separador de millares. Así pues, el valor 1.258,23, expresado para un script PHP, será 1258,23. Esto, en si, no es nada nuevo, sino que es una característica común de todos los lenguajes de programación. Esto se debe a que es la notación anglosajona, usada en informática. Otra cosa es que, al obtener un valor, lo formateemos antes de la salida, para que el usuario lo vea de otro modo, pero eso es harina de otro costal.

Para anotar números enteros, PHP nos permite manejar varias bases de numeración. Sin embargo, la tres que manejaremos con mayor frecuencia son: la decimal (base 10), la hexadecimal (base 16) y la octal (base 8). Cuando establecemos un valor numérico entero, PHP asume, por defecto, que se está en decimal (por ejemplo 1517). Para indicar que un valor está expresado en hexadecimal lo precederemos con 0x(por ejemplo, 0x5ED). Si queremos que PHP entienda que el valor está expresado en octal, lo precederemos con un 0 (por ejemplo, 02755). En ocasiones, estas notaciones pueden inducir a error a las personas no familiarizadas con ellas. En concreto, es fácil confundir un número octal con uno decimal. También pueden inducir a confusión el hecho de que, en la notación hexadecimal, no tiene importancia que las letras aparezcan en mayúsculas o en minúsculas. Preste especial atención a estos puntos.

Los números en coma flotante se pueden expresar con la notación clásica de un punto separando la parte entera de la fraccionaria (por ejemplo, 763747.56) o en su forma de mantisa y exponente (por ejemplo 17e23). En este último caso es indiferente que la letra e que separa ambos términos sea mayúscula o minúscula.

Una cosa que debe tener en cuenta cuando maneje valores aritméticos grandes es que el rango de estos tipos de números depende, en gran parte, de la plataforma sobre la que se esté ejecutando el script. Así, un equipo de 64 bits podrá, en principio, manejar números más grandes que uno de 32 bits. Con esto puede haber un problema: PHP no maneja desbordamientos, con lo que el resultado de algo tan simple como una suma o una multiplicación puede, si se supera la capacidad de proceso de la máquina, arrojar resultados erróneos y es fácil pasarlos por alto.

Aún hay otra cosa que debe tener en cuenta. El manejo de datos en coma flotante por parte de PHP no siempre es como se espera. Observe el siguiente script:

<?php echo (int)((0.1 + 0.7)*10);   ?>

En principio usted piensa que el resultado a visualizar será 8. Es decir, 0.1+0.7=0.8. Al multiplicarlo por 10, el resultado es, internamente, 8.0 (puesto que trabajamos con números en coma flotante) y al aplicarle el casting (int) obtendremos 8. Sin embargo, si prueba el script verá que el resultado es, sorprendentemente, 7. Sin embargo, si usted suprime el casting (int) verá que el resultado es correcto. Esto se debe a que el resultado obtenido de la operación aritmética no es, realmente, 8.0, sino 7.999999. Al aplicar el casting, simplemente se trunca la parte fraccionaria, dejando el resultado 7.

Para concluir esta avanzadilla al mundo de los números, únicamente recordarle que tenga siempre presente qué tipos de datos va a manejar y cómo.

Los datos de tipo String, también comprendidos dentro de la categoría de datos escalares, se usan, habitualmente, para almacenar y manipular cadenas de texto. En otros lenguajes de programación, sólo pueden usarse para esto. Sin embargo PHP gestiona los datos String como secuencias de datos binarios. Esto quiere decir que en una variable de este tipo se puede almacenar una cadena de texto (lo más usual) pero también un recurso de sistema, un archivo de imagen, sonido o vídeo, etc. En general, cualesquiera datos binarios.

Los datos booleanos sólo pueden asumir, como usted sabe, el valor true (verdadero) o false (falso). Por esta razón, constituyen la base de todas las operaciones lógicas. Dado que PHP es un lenguaje no tipado (es decir, que una variable puede cambiar de tipo simplemente cambiándole su valor) permite conversiones de tipos de datos con cierta flexibilidad. Uno de los casos más habituales es la interpretación de datos numéricos como booleanos. Por ejemplo, un número 0 se evalúa como false y cualquier otro valor numérico se evalúa como true. También las cadenas son susceptibles de ser interpretadas de este modo: una cadena vacía o con un único carácter 0 se evalúa como false. Si tiene cualquier otro contenido (incluso varios ceros) es evaluada como true. Suponga, por ejemplo, el siguiente script:

<?php  $cadena = “0”;
If($cadena){
echo “La cadena se evalúa como true.”;
} else {
echo  “La cadena se evalúa como false.”;
}?>

El resultado en la salida del navegador será: La cadena se evalúa como false.

Por otro lado, también es posible la interpretación inversa de los datos, es decir, interpretar un valor booleano como una cadena o un número. Si es un valor true, se registra como 1 y si es false, como 0.

Los datos compuestos

Como contraparte de los datos escalares que acabamos de ver, existen otros datos conocidos, genéricamente, como compuestos. Son aquellos que pueden, como mencionábamos anteriormente, almacenar varios valores simultáneamente. Se trata de las matrices y los objetos.

Otros datos

PHP gestiona, además, otro tipo de información no incluida en las anteriores categorías. Estos valores no son, estrictamente, datos escalares ni compuestos, por lo que no aparecen en la clasificación que hemos visto. En realidad, muchos programadores, los consideramos inclasificables, pero son unidades de información que existen y, por ello, están en este apartado específico.

Por una parte, está el valor NULL. Esto significa, realmente, “ningún valor”. Es decir, no representa un cero, ni una cadena vacía, ni un false, ni nada. Es el valor de una variable cuando aún no se le ha asignado nada. Suponga el siguiente script:

<?php echo gettype($miVariable);?>

En él se pretende, como ve, mostrar el tipo de dato de una variable que no existe. El resultado es NULL. También obtendremos este resultado de una variable que ya se haya usado en el script, si esta ha sido borrada con unset().

El otro tipo de dato al que aludimos en este apartado son los recursos. Se trata de búferes que PHP emplea para gestionar bases de datos, ficheros, imágenes, etc. Por ejemplo, cuando se establece una conexión con una base de datos, o se abre un fichero de texto, creando un manejador, se genera un recurso. Si, por ejemplo, intentamos convertir un manejador de un fichero de disco a una variable numérica, obtendremos el número que PHP le ha asignado a ese recurso. Si intentamos convertirlo a una variable de tipo String, obtendremos la secuencia Resource id # seguida del número de recurso. Por último, y esto es lo más importante que debemos tener en cuenta sobre los recursos, podemos convertirlo a un valor booleano. Si el recurso se ha podido crear sin problemas, obtendremos un valor true; si no se ha podido crear, se obtiene un valor false. Por esta razón, muchas funciones de PHP aparecen documentadas en el manual oficial del lenguaje especificando que devuelven false si no se han podido ejecutar adecuadamente. En realidad, si usted se para a echarle un vistazo al manual, verá que esta no es una característica exclusiva de las funciones que generan un recurso como pueda ser, por ejemplo, fopen(). Hay muchas otras (por ejemplo, define()) que también devuelven un valor booleano false si no se han podido ejecutar adecuadamente.

Nombres de variables y funciones

Usted ya conoce las reglas para establecer los nombres de las variables que utilice en sus scripts. A estas alturas no vamos a entrar en esos detalles. Y, sin duda, conoce también el uso de las llamadas variables variables, o nombres variables de variables. Así, pues, sabe que puede asignar, a una variable, el nombre de otra a la que desee acceder. Por ejemplo:

$cadena = “Esto es una cadena”;
$numero = 25;
$var1 = “cadena”;
echo $$var1;

Esto mostrará en la página Esto es una cadena, basándose en la llamada qu ese hace mediante el doble signo de dólar, tal como aparece en la línea resaltada. Es posible que usted no use este sistema de llamar a variables con mucha frecuencia. En realidad, nadie lo usa con demasiada frecuencia, sino sólo cuando es útil.

Lo que ya no es tan conocido es que PHP permite usar la misma técnica para llamar a funciones, tanto aquellas que están definidas en el propio lenguaje como las que define el usuario. Por ejemplo, observe el fragmento siguiente:

function f1(){
echo “Esto es f1”;
}
function f2(){
echo “Esto es f2”;
}
$llamada = “f1”;
$llamada();

Como ve, podemos asignar el nombre de una función a una variable y luego llamarla mediante el nombre de dicha variable. Observe que, en este caso, al contrario que en los nombre variables de variables, no recurrimos al doble signo de dólar. La razón de esto es obvia: los nombres de variables ya incluyen, de por sí, un signo de dólar, mientras que los nombres de funciones no.

Constantes

Usted conoce el uso normal de constantes en PHP, así como su creación mediante define(). Sin embargo, he querido incluir aquí un par de detalles que debe saber, y que no aparecen en la mayoría de la documentación existente. Por una parte, debe saber que las constantes sólo admiten valores escalares. No sé si alguna vez, llevado por la curiosidad, ha intentado usted definir una matriz constante, por  ejemplo. Si lo ha intentado, ya sabe que no es posible en modo alguno. Y otra cosa. Las constantes son siempre, al contrario que las variables, de ámbito global, es decir, accesibles desde cualquier parte del script donde se encuentran definidas. Es decir, aunque estén definidas dentro del cuerpo de una función, su contenido es visible, sin más, desde fuera de la función.

Mostrar valores en la página

PHP contempla, varios modos de mostrar valores numéricos, de cadena, etc. en una página. Los dos sistemas más habituales son el uso de print() y de echo. Mucha gente considera estas dos palabras clave como idénticas, como si una de ellas fuese un alias de la otra. Y, en la mayoría de los casos, lo son. Usted puede mostrar un valor, directamente en la página, con cualquiera de estas dos instrucciones. Sin embargo, hay una diferencia, sutil pero significativa, desde el punto de vista de un programador experimentado. Mientras que print() puede formar parte de expresiones complejas, echo no puede.

Observe la siguiente línea de código:

$miVariable = print(“Esto es una cadena”);

Si todo va bien ( si no se produce un error), en la página se mostrará la cadena y en la variable se almacenará el valor 1.

Sin embargo, tenga presente una cosa. Tal como dice el manual de PHP, print() no es una función, por lo que los paréntesis, al igual que  en el caso de echo, son opcionales, aunque mucha gente, por convencionalismo, los incluye. Al no ser, ninguna de ambas, funciones, no pueden ser referenciadas por el sistema de nombres de variables.

Comparte