# Variables 2

## Tipos de variables básicos

Los tipos de variables básicos son los siguientes:

- lógicas o booleanas (boolean)
- enteros (integer)
- decimales (float)
- cadenas (string)
- matrices (arrays)

Existen además los tipos:

- objetos (object)
- recursos (resource)
- nulo (NULL)

### Variables lógicas (boolean)

Las variables de tipo lógico sólo pueden tener el valor TRUE (verdadero) o FALSE (falso). Se suelen utilizar en las estructuras de control.

Nota: El ejemplo siguiente utiliza la estructura de selección if que se explica en detalle en la lección de estructuras de control. Para entender este ejemplo, es suficiente saber que if significa si (si como condición, no sí como afirmación) y va seguida de una comparación de igualdad == (las comparaciones se explican en la lección de operaciones lógicas). En caso de que la comparación sea cierta, es decir si los dos términos a ambos lados de la comparación son iguales, se ejecuta la instrucción entre corchetes { }.

    <?php
    $contestar = TRUE;

    if ($contestar==TRUE) {
      print "<p>La contraseña es pezespada.</p>";
    }

    if ($contestar==FALSE) {
      print "<p>Mis labios están sellados.</p>";
    }
    ?>
| <p>La contraseña es pezespada.</p>

Estos valores se pueden escribir en mayúsculas o minúsculas o combinando ambas, aunque se recomienda utilizar mayúsculas:

    <?php
    $contestar = False;

    if ($contestar==TRUE) {
      print "<p>La contraseña es pezespada.</p>";
    }

    if ($contestar==FALSE) {
      print "<p>Mis labios están sellados.</p>";
    }
    ?>
| <p>Mis labios están sellados.</p>

Nota: No es necesario comparar una variable lógica con TRUE o FALSE, podemos emplearla directamente en la condición del if.

    <?php
    $contestar = TRUE;

    if ($contestar) {
      print "<p>La contraseña es pezespada.</p>";
    } else {
      print "<p>Mis labios están sellados.</p>";
    }
    ?>
| <p>La contraseña es pezespada.</p>

Volver al principio de la página

### Variables enteras (integer)

Las variables de tipo entero pueden guardar números enteros (positivos o negativos).

    <?php
    $lado = 14;
    $area = $lado*$lado;

    print "<p>Un cuadrado de lado $lado cm tiene un área de $area cm<sup>2</sup>.</p>";
    ?>
| <p>Un cuadrado de lado 14 cm tiene un área de 196 cm<sup>2</sup>.</p>

Como las variables enteras se guardan en la memoria del ordenador utilizando un número de bytes fijo (que depende del ordenador, pero se puede averiguar mediante la constante predefinida PHP_INT_SIZE), no se pueden guardar números arbitrariamente grandes o pequeños. El valor más grande que se puede almacenar se puede averiguar mendiante la constante predefinida PHP_INT_MAX. Los enteros se guardan en notación complemento a dos.

#### Notación complemento a dos

En un byte (8 bits) se pueden almacenar 256 (28) valores diferentes. Eso permite almacenar por ejemplo, desde el valor 0 hasta el 255. Para almacenar tanto números negativos como positivos, se utiliza la notación complemento a dos, en la que la primera mitad de los valores representan los valores positivos (desde 0 hasta 127) y la segunda mitad de los valores representan los valores negativos (desde -128 hasta -1), como indica la tabla siguiente

El valor ... | 0 | 1 | 2 | 3 | 4 | 5 | ... | 126 | 127 | 128 | 129 | ... | 253 | 254 | 255
... representa el entero ... | 0 | 1 | 2 | 3 | 4 | 5 | ... | 126 | 127 | -128 | -127 | .. | -3 | -2 | -1

En cuatro bytes (32 bits) se pueden almacenar 4.294.967.296 (232)valores distintos. En notación complemento a dos se pueden representar desde el valor -2.147.483.648 hasta 2.147.483.647.

Si se intenta guardar un número demasiado grande positivo, el resultado será seguramente incorrecto. En el ejemplo siguiente se fuerza a PHP a guardar como entero el valor siguiente al máximo valor posible. El valor se guarda, pero cuando se utiliza, PHP lo interpreta como negativo.

    <?php
    $maximo = PHP_INT_MAX;
    print "<p>El mayor entero que se puede guardar en una variable entera es $maximo</p>";

    $demasiado = (int)($maximo+1);
    print "<p>Si se intenta guardar 1 más, el resultado es $demasiado</p>";
    ?>
| <p>El mayor entero que se puede guardar en una variable entera es 2147483647</p> <p>Si se intenta guardar 1 más, el resultado es -2147483648</p>

Volver al principio de la página

### Variables decimales (float)

Las variables de tipo decimal (float) pueden guardar números decimales (positivos o negativos). Como en las calculadoras, el separador de la parte entera y la parte decimal es el punto (.), no la coma (,)..

    <?php
    $lado = 14.5;
    $area = $lado*$lado;

    print "<p>Un cuadrado de lado $lado cm tiene un área de $area cm<sup>2</sup>.</p>";
    ?>
| <p>Un cuadrado de lado 14.5 cm tiene un área de 210.25 cm<sup>2</sup>.</p>

Como las variables decimales se guardan en la memoria del ordenador utilizando un número de bytes fijo (que depende del ordenador, aunque no existen constantes predefinidas para conocer su tamaño), no se pueden guardar números arbitrariamente grandes o pequeños. Normalmente las variables decimales siguen la norma IEEE 758, concretamente el formato denominado "doble precisión", que emplea 8 bytes (64 bits) para almacenar un número.

De esos 64 bits, uno se utiliza para el signo, 53 para la parte fraccionaria y 11 para el exponente. Eso hace que el valor más grande que se pueda almacenar sea aproximadamente 1,8.10308.

Si se intenta guardar un número demasiado grande positivo (tanto si ese valor se obtiene en un cálculo o si se escribe directamente) PHP no puede manejarlo y lo que hace es sustituirlo por la constante predefinida INF.

    <?php
    $maximo = pow(10,308);  // 10^308
    print "<p>10<sup>308</sup> se puede guardar en una variable decimal: $maximo</p>";

    $demasiado = 10*$maximo;
    print "<p>Si se intenta guardar 10<sup>309</sup>, el resultado es $demasiado</p>";
    ?>
| <p>10<sup>308</sup> se puede guardar en una variable decimal: 1.0E+308</p> <p>Si se intenta guardar 10<sup>309</sup>, el resultado es INF</p>

    <?php
    $prueba = 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
    print "<p>Si se intenta guardar 10<sup>309</sup>, el resultado es $prueba";
    ?>
| <p>Si se intenta guardar 10<sup>309</sup>, el resultado es INF</p>

Volver al principio de la página

### Variables de cadenas (string)

Las variables de tipo cadena pueden guardar caracteres.

PHP no impone ningún límite al tamaño de las cadenas. Las cadenas pueden ser todo lo largas que permita la memoria del servidor.

El juego de caracteres que utiliza PHP viene determinado en principio por el juego de caracteres que utiliza el fichero fuente del programa. Pero hay que tener en cuenta que las funciones de tratamiento de cadenas no están preparadas para tratar la diversidad de juegos de caracteres: muchas suponen que cada carácter ocupa solamente un byte, otras suponen un juego de caracteres determinado (UTF-8, por ejemplo), otras utilizan el juego de caracteres definido localmente, etc.

Se puede acceder a caracteres individuales indicando la posición del carácter, como si se tratara de una matriz de una dimensión en la que el primer carácter ocupa la posición 0.

    <?php
    $saludo = "Hola, Don Pepito";
    print "<p>$saludo</p>";

    $saludo[0]="M";
    print "<p>$saludo</p>";

    $saludo[14]="n";
    print "<p>$saludo</p>";
    ?>
| <p>Hola, Don Pepito</p> <p>Mola, Don Pepito</p> <p>Mola, Don Pepino</p>

Si se indica una posición mayor que la longitud de la cadena, la cadena se alarga con espacios hasta llegar a ese valor:

    <?php
    $saludo = "Hola, Don Pepito";
    print "<p>$saludo</p>";

    $saludo[16]="n";
    print "<p>$saludo</p>";

    $saludo[20]="!";
    print "<pre>$saludo</pre>";
    ?>
| <p>Hola, Don Pepito</p> <p>Hola, Don Pepiton</p>
    <pre>Hola, Don Pepiton   !</pre>

Si en una posición se guarda una cadena vacía, la cadena se acorta eliminando el carácter de esa posición

    <?php
    $saludo = "Hola, Don Pepito";
    print "<p>$saludo</p>";

    $saludo[4]="";
    print "<p>$saludo</p>";
    ?>
| <p>Hola, Don Pepito</p> <p>Hola Don Pepito</p>

Volver al principio de la página

### Matrices (arrays)

Las matrices se tratan en la lección Matrices.

Volver al principio de la página

## Conversiones de tipos

PHP permite convertir variables de un tipo en otro tipo o considerar variables de un tipo como otro.

### Variables como variables lógicas

Si una variable entera o decimal cuyo valor sea igual a cero se considera como variable lógica, se considera que tiene el valor FALSE. Si una variable entera o decimal distinta de cero se considera como variable lógica, se considera que tiene el valor TRUE.

    <?php
    $contestar = 5;

    if ($contestar==TRUE) {
      print "<p>La contraseña es pezespada.</p>";
    }

    if ($contestar==FALSE) {
      print "<p>Mis labios están sellados.</p>";
    }
    ?>
| <p>La contraseña es pezespada.</p>
    <?php
    $contestar = 0.0;

    if ($contestar==TRUE) {
      print "<p>La contraseña es pezespada.</p>";
    }

    if ($contestar==FALSE) {
      print "<p>Mis labios están sellados.</p>";
    }
    ?>
| <p>Mis labios están sellados.</p>
    <?php
    $contestar = 5;

    if ($contestar) {
      print "<p>La contraseña es pezespada.</p>";
    } else {
      print "<p>Mis labios están sellados.</p>";
    }
    ?>
| <p>La contraseña es pezespada.</p>

Si una cadena vacía se considera como variable lógica, se considera que tiene el valor FALSE. Si una cadena no vacía se considera como variable lógica, se considera que tiene el valor TRUE.

    <?php
    $contestar = "a ver qué pasa";

    if ($contestar==TRUE) {
      print "<p>La contraseña es pezespada.</p>";
    }

    if ($contestar==FALSE) {
      print "<p>Mis labios están sellados.</p>";
    }
    ?>
| <p>La contraseña es pezespada.</p>
    <?php
    $contestar = "";

    if ($contestar==TRUE) {
      print "<p>La contraseña es pezespada.</p>";
    }

    if ($contestar==FALSE) {
      print "<p>Mis labios están sellados.</p>";
    }
    ?>
| <p>Mis labios están sellados.</p>
    <?php
    $contestar = "a ver qué pasa";

    if ($contestar) {
      print "<p>La contraseña es pezespada.</p>";
    } else {
      print "<p>Mis labios están sellados.</p>";
    }
    ?>
| <p>La contraseña es pezespada.</p>

Las cadenas no vacías se consideran como TRUE, aunque tengan un valor que puedan confundirnos:

    <?php
    $contestar = "NO";

    if ($contestar==TRUE) {
      print "<p>La contraseña es pezespada.</p>";
    }

    if ($contestar==FALSE) {
      print "<p>Mis labios están sellados.</p>";
    }
    ?>
| <p>La contraseña es pezespada.</p>
    <?php
    $contestar = "FALSE";

    if ($contestar==TRUE) {
      print "<p>La contraseña es pezespada.</p>";
    }

    if ($contestar==FALSE) {
      print "<p>Mis labios están sellados.</p>";
    }
    ?>
| <p>La contraseña es pezespada.</p>
    <?php
    $contestar = "NO";

    if ($contestar==TRUE) {
      print "<p>La contraseña es pezespada.</p>";
    } else {
      print "<p>Mis labios están sellados.</p>";
    }
    ?>
| <p>La contraseña es pezespada.</p>

Las matrices se consideran siempre como TRUE:

    <?php
    $contestar['nombre'] = "Pepe";

    if ($contestar==TRUE) {
      print "<p>La contraseña es pezespada.</p>";
    }

    if ($contestar==FALSE) {
      print "<p>Mis labios están sellados.</p>";
    }
    ?>
| <p>La contraseña es pezespada.</p>
    <?php
    $contestar['nombre'] = "";

    if ($contestar==TRUE) {
      print "<p>La contraseña es pezespada.</p>";
    }

    if ($contestar==FALSE) {
      print "<p>Mis labios están sellados.</p>";
    }
    ?>
| <p>La contraseña es pezespada.</p>
    <?php
    $contestar['nombre'] = "Pepe";

    if ($contestar==TRUE) {
      print "<p>La contraseña es pezespada.</p>";
    } else {
      print "<p>Mis labios están sellados.</p>";
    }
    ?>
| <p>La contraseña es pezespada.</p>

Volver al principio de la página

Esta obra está bajo una licencia de Creative Commons Reconocimiento-CompartirIgual 3.0 España.