Variables

¿Qué es una variable?

En los lenguajes de programación, una variable es un elemento que permite almacenar información. Las variables se identifican por su nombre. Para facilitar la comprensión del programa, se aconseja que los nombres de las variables hagan referencia a la información que contienen. Por ejemplo, si se va a guardar en una variable la edad del usuario, un nombre adecuado de la variable sería por ejemplo $edad.

En PHP el programador puede dar el nombre que quiera a las variables, con algunas restricciones:

<?php
// Ejemplos de nombres de variables:
$edad   = 16;
$edad1  = 17;
$edad_1 = 18;
// Ejemplos de nombres de variables (estilos NO redomendados)
$años = 19;
$_edad  = 20;
$Edad   = 21;
$__edad = 22;
$EDAD   = 23;
$_EDAD  = 24;
?>

Los nombres de variables pueden contener caracteres no ingleses (vocales acentuadas, eñes (ñ) o cedillas (ç), etc.) pero se aconseja no hacerlo. Si los programas que escribimos los van a leer solamente programadores de países en los que también se utilizan esos caracteres, no habrá inconveniente, pero si colaboran con nosotros programadores de países en los que esos caracteres no se utilizan, les resultarán incómodo editar los programas. De hecho, algunos aconsejan incluso utilizar términos ingleses en los nombres de variables para facilitar la colaboración entre programadores de distintos países.

En los nombres de las variables, PHP distingue entre mayúsculas y minúsculas, es decir, si se cambia algún carácter de mayúscula a minúscula o viceversa, para PHP se tratará de variables distintas.

Si el nombre de la variable contiene varias palabras, se aconseja utilizar la notación "camel case", es decir, escribir la primera palabra en minúsculas y la primera letra de las siguientes palabras en mayúsculas.

<?php
// Ejemplos de nombres de variables Camel Case:
$edadHijo          = 16;       // edad del hijo
$edadMadre         = 47;       // edad de la madre
$edadPadre         = 46;       // edad del padre
$edadAbueloPaterno = 73;       // edad del abuelo paterno
?>

PHP define automáticamente una serie de variables (son las llamadas variables predefinidas). Los nombres de estas variables siguen siempre el mismo patrón: empiezan por un guion bajo y se escriben en mayúsculas (por ejemplo, $_REQUEST, $_SERVER, $_SESSION, etc.). Para evitar conflictos con variables predefinidas que se creen en el futuro, se recomienda no crear en los programas variables con nombres que sigan ese mismo patrón.

Usar variables

Para guardar un valor en una variable se utiliza el operador de asignación (=) escribiendo a la izquierda únicamente el nombre de la variable y a la derecha el valor que queremos guardar. Si queremos guardar un número, no hace falta poner comillas, pero si queremos guardar una cadena de texto hay que poner comillas (dobles o simples).

<?php
$edad = 15;                // La variable $edad tiene ahora el valor 15
$nombre = "Pepito Conejo"  // La variable $nombre tiene ahora el valor Pepito Conejo
?>

El programa anterior es correcto, aunque no produciría ningún resultado visible para el usuario.


En el lado izquierdo de la asignación (=) no se puede escribir más que el nombre de una variable. El programa siguiente no es sintácticamente correcto por lo que no se ejecutará y PHP mostrará un mensaje de error.

Incorrecto
<?php
$edad + 1 = 16;
print $edad;
?>

Parse error: syntax error, unexpected '=' in ejemplo.php on line 2


Una vez se ha guardado un valor en una variable, se puede utilizar en el resto del programa.

<?php
$edad = 15;
?>
15

Se pueden concatenar asignaciones para guardar el mismo valor en varias variables.

<?php
$x = $y = $z = 1;
print "<p>$x $y $z</p>\n";
?>
<p>1 1 1</p>

A lo largo de un programa una variable puede guardar diferentes valores.

<?php
$edad = 15;
print "<p>$edad</p>\n";
$edad = 20;
print "<p>$edad</p>\n";
?>
<p>15</p>
<p>20</p>

En la parte derecha de la asignación se pueden escribir expresiones matemáticas:

<?php
$radio = 15;
$perimetro = 2 * 3.14 * 15;
print $perimetro;
?>
94.2

Esas expresiones pueden contener variables:

<?php
$radio = 15;
$perimetro = 2 * 3.14 * $radio;
print $perimetro;
?>
94.2

En PHP una igualdad no es una ecuación matemática, sino una asignación (el resultado de la derecha se almacena en la variable de la izquierda). Por ello, una asignación pueden utilizar en el lado derecho la variable en la que se va a guardar el resultado:

<?php
$edad = 15;
$edad = 2 * $edad;
print $edad;
?>
30

Lo que hace el ordenador es calcular el resultado de la expresión de la derecha utilizando el valor actual de la variable y finalmente guardar el resultado en la variable.


En los nombres de las variables, PHP distingue entre mayúsculas y minúsculas, es decir, si se cambia algún carácter de mayúscula a minúscula o viceversa, para PHP se tratará de variables distintas.

<?php
$Edad = 15;
$edad = 20;
print $Edad;
?>
15

Una variable pueda tomar valores de tipos distintos a lo largo de un programa.

<?php
$edad = 15;
print "<p>$edad</p>\n";
$edad = "quince";
print "<p>$edad</p>\n";
?>
<p>15</p>
<p>quince</p>

Concatenar variables y cadenas

En general se desaconseja escribir cadenas muy largas en un programa, porque tanto si el editor ajusta la línea como si no, el programa resulta incómodo de leer (si no se ajusta la línea porque hay que desplazarse a la derecha para poder leer el contenido, si se ajusta la línea porque el sangrado se pierde en la segunda línea y siguientes). Una manera de evitar cadenas demasiado largas podría consistir en escribir varias instrucciones print consecutivas:

<?php
print "<p>Este párrafo es bastante largo. Si lo escribimos en una sola línea, el código fuente "
print "del programa resulta incómodo de leer, así que la partimos en varias cadenas escritas "
print "en instrucciones print consecutivas.</p>\n";
?>

Pero también se puede utilizar el operador de concatenación . (punto), que permite concatenar cadenas.

<?php
print "<p>Este párrafo es bastante largo. Si lo escribimos en una sola línea, el código fuente "
    . "del programa resulta incómodo de leer, así que la partimos en varias cadenas concatenadas "
    . "por el operador de concatenación: . (punto)</p>\n";
?>

El operador . (punto) también permite concatenar cadenas o variables.

<?php
$cadena1 = "Pasa";
$cadena2 = "tiempos";
$cadena3 = $cadena1 . $cadena2;
print "<p>$cadena3</p>\n";
?>
<p>Pasatiempos</p>
<?php
$cadena1 = "Corre";
$cadena2 = "ve";
$cadena3 = "idile";
$cadena4 = $cadena1 . $cadena2 . $cadena3;
print "<p>$cadena4</p>\n";
?>
<p>Correveidile</p>

El operador . (punto) debe escribirse entre espacios en blancos, no solamente porque sea el formato recomendado, sino para evitar posibles errores. El programa de ejemplo siguiente es incorrecto:

Incorrecto
<?php
print "<p>1.5 + 1 = " . 1.5 + 1. "</p>\n";
?>

Parse error: syntax error, unexpected double-quoted string "</p>\n" inejemplo.php on line 2

Al escribir el operador punto unido al número 1, PHP interpreta que se trata de un número decimal y no sabe qué hacer con la cadena que hay a continuación. Separando el operador punto del número, el programa funcionaría correctamente.

Correcto
<?php
print "<p>1.5 + 1 = " . 1.5 + 1 . "</p>\n";
?>
<p>1.5 + 1 = 2.5<p>

El operador . (punto) se puede utilizar en la instrucción print. En el ejemplo siguiente se concatenan una cadena, una variable y una cadena.

<?php
$nombre = "Don Pepito";
print "<p>¡Hola, " . $nombre . "! ¿Cómo está usted?</p>\n";
?>
<p>¡Hola, Don Pepito! ¿Cómo está usted?</p>

Nota: En el ejemplo anterior, se puede obtener el mismo resultado sin utilizar el operador . (punto), escribiendo la variable en la cadena:

<?php
$nombre = "Don Pepito";
print "<p>¡Hola, $nombre! ¿Cómo está usted?</p>\n";
?>
<p>¡Hola, Don Pepito! ¿Cómo está usted?</p>

En el ejemplo siguiente no queda más remedio que utilizar el operador . (punto) porque uno de los datos que se intercala es el resultado de una operación.

<?php
$semanas = 5;
print "<p>$semanas semanas son " . 7 * $semanas . " días.</p>\n";
?>
<p>5 semanas son 35 días.</p>

Variables en cadenas

La forma de insertar variables dentro de cadenas depende del tipo de variable utilizado.

Tipos de variables

En el caso de números, cadenas o matrices de una dimensión, las variables se puede insertar directamente:

<?php
$numero = 5000;
$texto = "cinco mil";
$seEscribe = ["separado", "junto"];
print "<p>El número $numero se escribe $seEscribe[0]: $texto</p>\n";
?>
<p>El número 5000 se escribe separado: cinco mil</p>

En el caso de matrices de dos o más dimensiones, las variables no se puede insertar directamente:

Desaconsejado
<?php
$nombre = "Don Pepito";
$saludos = [["Hello", "Hola"], ["Goodbye", "Adios"]];

print "<p>¡$saludos[0][1], $nombre! ¿Cómo está usted?</p>\n";
?>
<b>Warning</b>:  Array to string conversion in <b>ejemplo.php</b> on line <b>5</b><br />
<p>¡Array[1], Don Pepito! ¿Cómo está usted?</p>

Este resultado se obtiene porque PHP no sustituye la variable $saludos[0][1] por su valor, sino que sustituye únicamente la primera parte ($saludos[0]). Como $saludos[0] es una matriz de una dimensión, no puede escribir ningún valor y devuelve simplemente "Array". A continuación, PHP añade el [1] que quedaba y se obtiene la cadena "Array[1]".

Una solución a este problema es sacar la matriz de la cadena:

<?php
$nombre = "Don Pepito";
$saludos = [["Hello", "Hola"], ["Goodbye", "Adios"]];
print "<p>¡" . $saludos[0][1] . ", $nombre! ¿Cómo está usted?</p>\n";
?>
<p>¡Hola, Don Pepito! ¿Cómo está usted?</p>

Otra solución sin necesidad de sacar la matriz de la cadena es rodear la variable con llaves ({ }):

<?php
$nombre = "Don Pepito";
$saludos = [["Hello", "Hola"], ["Goodbye", "Adios"]];
print "<p>¡{$saludos[0][1]}, $nombre! ¿Cómo está usted?</p>\n";
?>
<p>¡Hola, Don Pepito! ¿Cómo está usted?</p>

Operaciones aritméticas y llamadas a funciones

En el interior de las cadenas no se realizan operaciones aritméticas o llamadas a funciones.

Desaconsejado
<?php
$x = 3;
$y = 4;
print "<p>Suma: $x + $y = $x + $y</p>\n";
print "<p>Multiplicación: $x x $y = $x * $y</p>\n";
print "<p>Potencia: $x ^ $y = pow($x, $y)</p>\n";
?>
<p>Suma: 3 + 4 = 3 + 4</p>
<p>Multiplicación: 3 x 4 = 3 x 4</p>
<p>Potencia: 3 ^ 4 = pow(3, 4)</p>

Si se quiere mostrar el resultado de operaciones matemáticas o de llamadas a funciones, es necesario efectuar las operaciones fuera de las cadenas.

<?php
$x = 3;
$y = 4;
print "<p>Suma: $x + $y = " . $x + $y . "</p>\n";
print "<p>Multiplicación: $x x $y = " . $x * $y . "</p>\n";
print "<p>Potencia: $x ^ $y = " . pow($x, $y) . "</p>\n";
?>
<p>Suma: 3 + 4 = 7</p>
<p>Multiplicación: 3 x 4 = 12</p>
<p>Potencia: 3 ^ 4 = 81</p>

Nota: Antes de PHP 8.0 (publicado en noviembre de 2020), las expresiones que contenían sumas o restas debían escribirse entre paréntesis, como se comenta en la lección Cambios en el lenguaje.

Por supuesto, siempre se pueden utilizar definir auxiliares que guarden los resultados y utilizar las variables auxiliares en la cadena.

<?php
$x = 3;
$y = 4;
$suma = $x + $y;
$producto = $x * $y;
$potencia = pow($x, $y);
print "<p>Suma: $x + $y = $suma</p>\n";
print "<p>Multiplicación: $x x $y = $producto</p>\n";
print "<p>Potencia: $x ^ $y = $potencia</p>\n";
?>
<p>Suma: 3 + 4 = 7</p>
<p>Multiplicación: 3 x 4 = 12</p>
<p>Potencia: 3 ^ 4 = 81</p>

Nombres de variables

Si se quiere escribir el nombre de una variable, es decir, para que PHP no sustituya la variable por su valor, hay que escribir una contrabarra (\) antes de la variable.

<?php
$x = 3;
print "<p>La variable \$x vale $x</p>\n";
?>
<p>La variable $x vale 3</p>

Unir variables y texto

En html/css a veces es necesario juntar números y caracteres, como en el ejemplo siguiente en el que se establece el tamaño del párrafo en 30px:

<?php
print "<p style=\"font-size: 30px\">Texto grande</p>\n";
?>
<p style="font-size: 30px">Texto grande</p>

Si el tamaño está almacenado en una variable, no se puede juntar la variable con los caracteres ya que se interpretaría como una variable que no está definida y toma el valor vacío:

Desaconsejado
<?php
$x = 30;

print "<p style=\"font-size: $xpx\">Texto grande</p>\n";
?>
<p style="font-size: ">Texto grande</p>

... pero se pueden utilizar llaves o sacar la variable de la cadena:

<?php
$x = 30;
print "<p style=\"font-size: {$x}px\">Texto grande</p>\n";
?>
<p style="font-size: 30px">Texto grande</p>
<?php
$x = 30;
print "<p style=\"font-size: " . $x . "px\">Texto grande</p>\n";
?>
<p style="font-size: 30px">Texto grande</p>
<?php
$x = 30;
print "<p style=\"font-size: $x" . "px\">Texto grande</p>\n";
?>
<p style="font-size: 30px">Texto grande</p>

Dentro de las llaves no se pueden realizar operaciones. Si se realizan operaciones, se puede producir un error de sintaxis u obtener resultados no esperados:

Incorrecto
<?php
$x = 7;

print "<p>{$x} por {$x} es {$x * $x}</p>\n";
?>

Parse error: syntax error, unexpected '*', expecting :: (T_PAAMAYIM_NEKUDOTAYIM) in ejemplo.php on line 4

Desaconsejado
<?php
$x = 7;

print "<p>2 por {$x} es {2 * $x}</p>\n";
?>

2 por 7 es {2 * 7}

Nota: T_PAAMAYIM_NEKUDOTAYIM es el nombre en hebreo del signo :: (dos puntos duplicados).

Mostrar información sobre las variables para depuración de programas

En la fase de elaboración de un programa, puede ser necesario verificar el valor de una variable para asegurarse del correcto funcionamiento del programa. Una forma rápida de hacerlo es utilizar las funciones que se comentan a continuación. Por supuesto, estas funciones deben eliminarse posteriormente, ya que en la versión final del programa no tiene sentido mostrar esos valores. La ventaja de haber utilizar funciones especiales en vez de print es que es fácil buscarlas y borrarlas.