Tipos de variables

Tipos de variables básicos

Los tipos de variables básicos son los siguientes:

Existen además los tipos:

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>\n";
}

if ($contestar == false) {
  print "<p>Mis labios están sellados.</p>\n";
}
?>
<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 minúsculas:

Desaconsejado
<?php
$contestar = fAlSe;

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

if ($contestar == FaLsE) {
  print "<p>Mis labios están sellados.</p>\n";
}
?>
<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) {  // equivale a $contestar == true
  print "<p>La contraseña es pezespada.</p>\n";
} else {
  print "<p>Mis labios están sellados.</p>\n";
}
?>
<p>La contraseña es pezespada.</p>
<?php
$errorDetectado = false;

if (!$errorDetectado) {  // equivale a $errorDetectado == false
  print "<p>No se han detectado errores.</p>\n";
} else {
  print "<p>Se han detectado errores.</p>\n";
}
?>
<p>No se han detectado errores.</p>

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 \ntiene un área de $area cm<sup>2</sup>.</p>\n";
?>
<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>\n";

$demasiado = (int)($maximo+1);
print "<p>Si se intenta guardar 1 más, el resultado es $demasiado</p>\n";
?>
<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> 

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 \ntiene un área de $area cm<sup>2</sup>.</p>\n";
?>
<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>\n";

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

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>\n";

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

$saludo[14] = "n";
print "<p>$saludo</p>\n";
?>
<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>\n";

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

$saludo[25] = "!";
print "<pre>$saludo</pre>\n";
?>
<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>\n";

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

Matrices (arrays)

Las matrices se tratan en la lección Matrices.

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>\n";
}

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

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

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

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

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

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

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

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

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

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

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

if ($contestar == true) {
  print "<p>La contraseña es pezespada.</p>\n";
} else {
  print "<p>Mis labios están sellados.</p>\n";
}
?>
<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>\n";
}

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

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

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

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