Contenidos
- Generar salida utilizando
echoyprint.- Utilizar la sintaxis corta
<?= ... ?>. - Comprender cómo PHP trabaja con cadenas de caracteres.
- Diferenciar comillas simples y dobles.
- Utilizar secuencias de escape.
- Generar texto con formato mediante
printf(). - Inspeccionar variables con
print_r()yvar_dump(). - Utilizar Xdebug para mejorar la información de depuración.
- Utilizar la sintaxis corta
Escribiendo
Una de las típicas acciones de un programa es generar una respuesta.

Para hacerlo en php, disponemos de dos instrucciones del lenguaje y una serie de funciones
<?php
echo "Hola mundo";
?>Pero conviene entender qué significa realmente escribir en una aplicación PHP.
PHP se ejecuta en el servidor.
Cuando hacemos:
echo "<h1>Hola</h1>";PHP no dibuja un título en la pantalla.
Simplemente genera este texto:
<h1>Hola</h1>Ese contenido se envía en la respuesta HTTP y será posteriormente el navegador quien interprete el HTML y lo represente visualmente.
Para generar salida e inspeccionar información en PHP disponemos de construcciones del lenguaje y funciones incorporadas:
Construcciones del lenguaje
echo: muestra una o varias expresiones.print: muestra una expresión y devuelve1.<?= ... ?>: sintaxis abreviada deecho.
Funciones incorporadas de PHP
printf(): muestra texto con formato.sprintf(): genera y retorna una cadena con formato sin mostrarla.print_r()[1]: muestra información legible de variables, especialmente arrays y objetos.var_dump(): muestra el tipo y el valor de una o varias variables.var_export()[1:1]: genera una representación de una variable como código PHP.
Primitivas del lenguaje
Como hemos comentado tenemos 2 primitivas y una exprsión que permite abreviarlas:
echo
echo permite enviar una o varias expresiones a la salida generada por PHP.
Aunque su aspecto pueda recordar al de una función, echo no es una función, sino una construcción propia del lenguaje PHP.
Por ese motivo, normalmente se escribe sin paréntesis:
<?php
echo "Hola Mundo";
?>También podemos encontrar:
<?php
echo ("Hola");
?>Esos paréntesis no convierten a echo en una función. En realidad forman parte de la expresión que estamos mostrando.
Una característica particular de echo es que permite escribir varios argumentos separados mediante comas. Esto simplemente es una característica del operador, pero no aporta mucho.
<?php
$nombre = "Ana";
$edad = 24;
echo "Nombre: ", $nombre, " - Edad: ", $edad;
?>El resultado será:
Nombre: Ana - Edad: 24No es una utilidad interesante, pero existe en la primitiva. También podríamos concatenar los valores:
<?php
echo "Nombre: " . $nombre . " - Edad: " . $edad;
?>Más adelante veremos con detalle el operador de concatenación . (punto).
echo genera salida, pero no devuelve un resultado.
Por tanto, esto no es válido:
<?php
$retorno = echo "Hola";
?>Antes de ejecutar el código, intenta averiguar exactamente qué aparecerá:
<?php
$nombre = "Laura";
$edad = 22;
echo "Hola ", $nombre;
echo " tienes ", $edad, " años";
?>Prueba ahora a:
- Cambiar los valores de las variables.
- Añadir más argumentos al segundo
echo. - Sustituir las comas por concatenaciones utilizando
.. - Comprobar si obtienes exactamente la misma salida.
La sintaxis corta <?= ?>
Cuando PHP se mezcla con HTML existe una forma especialmente cómoda de escribir un valor:
<?= $variable ?>Es equivalente a:
<?php echo $variable; ?>Por ejemplo:
<?php
$usuario = "Manuel";
?>
<h1>Bienvenido <?= $usuario ?></h1>Otro ejemplo:
<p>Hoy es <?= date("d/m/Y") ?></p>La construcción:
<?= expresión ?>es una forma abreviada de:
<?php echo expresión; ?>Resulta especialmente útil cuando estamos construyendo vistas HTML.
La utilizaremos muchísimo más adelante.
Pregunta
¿Qué versión resulta más legible?
Compara:
<?php echo "<h1>Bienvenido " . $usuario . "</h1>"; ?>con:
<h1>Bienvenido <?= $usuario ?></h1>¿Cuál permite distinguir mejor el HTML del código PHP?
print
PHP dispone también de print.
<?php
print "Hola mundo";A primera vista se comporta prácticamente igual que echo, pero existen dos diferencias:
printadmite una única expresión.printdevuelve siempre el valor entero1.
Por ejemplo:
<?php
```php
<?php
$resultado = print "Hola mundo";
var_dump($resultado);?>
Primero se escribirá:
Hola mundoy $resultado contendrá:
int(1)Esto permite utilizar print dentro de una expresión, aunque en código habitual rara vez necesitaremos hacerlo.
echo Vs print
| Característica | echo | print |
|---|---|---|
| Es una función | No | No |
| Es una construcción del lenguaje | Sí | Sí |
| Varios argumentos | Sí | No |
| Devuelve un valor | No | Sí, siempre 1 |
| Uso habitual | Muy frecuente | Menos frecuente |
En nuestros programas utilizaremos normalmente echo.
No porque la diferencia de rendimiento sea relevante, sino porque:
- es la construcción más habitual para generar salida;
- admite varios argumentos;
- expresa claramente que únicamente queremos enviar información a la salida.
print conviene conocerlo, pero aparecerá mucho menos en nuestro código.
Ejecuta:
<?php
echo "Uno", " - ", "Dos";
echo "\n";
print "Tres";
$retorno = print " - Cuatro";
echo "\n";
var_dump($retorno);
?>Comprueba:
- que
echoacepta varios argumentos;- que
printsolo recibe una expresión; - qué valor queda almacenado en
$retorno.
- que
Después prueba:
print "Uno", "Dos";¿Qué ocurre?
printf(): salida con formato
Cuando necesitamos controlar el formato de determinados valores podemos utilizar printf().
A diferencia de echo y print, printf() sí es una función.
Por ejemplo:
<?php
$precio = 5.25251;
printf("Precio: %.2f €", $precio);
?>La salida será:
Precio: 5.25 €%.2f indica que queremos mostrar un número decimal con dos cifras decimales.
| Especificador | Representación |
|---|---|
%s | String |
%d | Entero decimal |
%u | Entero decimal sin signo |
%f | Número decimal |
%e | Notación científica |
%b | Binario |
%o | Octal |
%x | Hexadecimal en minúsculas |
%X | Hexadecimal en mayúsculas |
%c | Carácter |
Ejemplo:
<?php
$numero = 42;
printf("Decimal: %d\n", $numero);
printf("Binario: %b\n", $numero);
printf("Octal: %o\n", $numero);
printf("Hexadecimal: %X\n", $numero);
?>
<?php
$numero = 42;
$precio = 15.6789;
printf("Decimal: %d\n", $numero);
printf("Binario: %b\n", $numero);
printf("Octal: %o\n", $numero);
printf("Hexadecimal: %X\n", $numero);
echo "\n";
printf("Precio sin formato: %f\n", $precio);
printf("Precio con 2 decimales: %.2f\n", $precio);Modifica los valores y comprueba los distintos formatos.
¿Qué diferencia observas entre %f y %.2f?
Funciones de debug: Inspeccionando variables
echo está pensado principalmente para generar salida.
Pero mientras desarrollamos un programa muchas veces necesitamos responder a preguntas distintas:
- ¿qué contiene esta variable?
- ¿qué tipo tiene?
- ¿qué elementos contiene este array?
- ¿qué estructura tiene este objeto?
Para eso PHP dispone de herramientas específicas de inspección:
print_r()
print_r() muestra información de una variable de una forma relativamente legible.
Es especialmente útil con arrays y objetos.
<?php
$frutas = ["manzana", "plátano", "naranja"];
print_r($frutas);La salida será similar a:
Array
(
[0] => manzana
[1] => plátano
[2] => naranja
)Con echo no podríamos inspeccionar directamente el contenido de un array de esta forma.
Normalmente print_r() escribe directamente el resultado:
print_r($frutas);Pero dispone de un segundo argumento.
Si indicamos true:
$resultado = print_r($frutas, true);en lugar de mostrar la información, la devuelve como un string.
Después podríamos hacer:
echo $resultado;Añade nuevos elementos al array y observa cómo cambia la salida.
<?php
$alumno = [
"nombre" => "Laura",
"edad" => 22,
"curso" => "DAW"
];
print_r($alumno);
?>Añade nuevos elementos al array y observa cómo cambia la salida.
:::
var_dump()
var_dump() proporciona más información que print_r().
No muestra únicamente el valor: también informa del tipo de dato.
<?php
$nombre = "Ana";
$edad = 23;
$nota = 8.5;
$aprobado = true;
var_dump($nombre);
var_dump($edad);
var_dump($nota);
var_dump($aprobado);
?>Ejecuta y observa la salida Observa que var_dump() nos permite distinguir los tipos de los valores (42, vs "42"), Aunque visualmente puedan parecer iguales:
<?php
var_dump(42);
var_dump("42");
?>print_r() resulta cómodo para ver la estructura y contenido de arrays y objetos.
var_dump() proporciona además información sobre los tipos de datos.
Durante el desarrollo utilizaremos con frecuencia var_dump() para entender qué está ocurriendo en nuestro programa.
Ninguna de las dos está pensada para generar la interfaz final que verá el usuario.
Ejecuta:
<?php
$valores = [
42,
"42",
3.14,
true,
false,
null,
"Hola"
];
print_r($valores);
echo "\n----------------\n";
var_dump($valores);
?>Compara ambas salidas.
¿Qué información proporciona var_dump() que no resulta tan evidente con print_r()?
Mejorando var_dump() con Xdebug
PHP incluye var_dump() de forma nativa.
No necesitamos instalar nada para utilizarlo.
Sin embargo, durante el desarrollo podemos instalar Xdebug, una extensión de PHP que añade distintas herramientas de depuración.
Entre ellas se encuentra una presentación mejorada de var_dump().
Xdebug es una extensión para PHP orientada al desarrollo y la depuración.
Puede proporcionar, entre otras funcionalidades:
- una presentación mejorada de
var_dump(); - información más detallada sobre errores;
- trazas de ejecución;
- depuración paso a paso desde un IDE;
- análisis de cobertura de tests;
- profiling.
No forma parte del núcleo de PHP: debemos instalarlo como una extensión.
Instalar Xdebug en nuestro contenedor
Si nuestra imagen parte de:
FROM php:8.5-apachepodemos instalar Xdebug mediante PECL:
FROM php:8.5-apache
RUN pecl install xdebug \
&& docker-php-ext-enable xdebugDespués podemos añadir su configuración:
RUN echo "xdebug.mode=develop" \
> /usr/local/etc/php/conf.d/99-xdebug.iniEl Dockerfile quedaría:
FROM php:8.5-apache
RUN pecl install xdebug \
&& docker-php-ext-enable xdebug
RUN echo "xdebug.mode=develop" \
> /usr/local/etc/php/conf.d/99-xdebug.iniReconstruimos la imagen:
docker compose buildy levantamos nuevamente los contenedores:
docker compose up -dPodemos comprobar los módulos cargados:
docker compose exec web php -mEntre ellos debería aparecer:
xdebugTambién podemos consultar directamente la información de la extensión:
docker compose exec web php --ri xdebugO desde una página PHP:
<?php
xdebug_info();TIP
En nuestro componente de ejecución sandbox que tenemos para nuestros apuntes, no está instalado xdebug, por lo que no lo podremos probar
Xdebug tiene diferentes modos de funcionamiento.
El modo:
xdebug.mode=developactiva sus herramientas de ayuda durante el desarrollo, entre ellas la presentación mejorada de var_dump().
Más adelante, cuando configuremos la depuración paso a paso con PhpStorm o VS Code, podremos utilizar también:
xdebug.mode=develop,debugInstalar Xdebug y activar el depurador paso a paso son, por tanto, dos cosas diferentes.
var_dump() con Xdebug
Nuestro código PHP no cambia:
<?php
$alumno = [
"nombre" => "Laura",
"edad" => 22,
"modulos" => [
"Servidor",
"Cliente",
"Despliegue"
]
];
var_dump($alumno);Seguimos utilizando la función estándar:
var_dump($alumno);pero Xdebug puede mejorar su representación mostrando la estructura de los datos de una forma más cómoda durante el desarrollo.
Esto es importante:
var_dump($variable);es PHP. Xdebug no crea var_dump().
Lo que hace Xdebug es mejorar su comportamiento y presentación cuando la extensión está instalada y configurada adecuadamente.
Por tanto, nuestro código funcionaría igual aunque Xdebug no esté instalado.
¿Qué herramienta utilizo?
Podemos resumir lo visto de esta forma:
| Necesito... | Utilizaría |
|---|---|
| Mostrar texto | echo |
| Insertar un valor dentro de HTML | <?= ... ?> |
| Mostrar texto mediante otra construcción del lenguaje | print |
| Dar formato a números o cadenas | printf() |
| Examinar rápidamente un array u objeto | print_r() |
| Conocer valor y tipo de una variable | var_dump() |
| Mejorar la depuración durante el desarrollo | Xdebug |
Realiza las siguientes pruebas:
- Muestra un mensaje utilizando
echo. - Inserta
$nombredentro de un string utilizando comillas dobles. - Repite la operación utilizando comillas simples y explica la diferencia.
- Utiliza
\ne inspecciona el código fuente generado. - Genera un salto visual utilizando
<br>. - Muestra
$notacon exactamente dos decimales utilizandoprintf(). - Inspecciona
$modulosutilizandoprint_r(). - Inspecciona todas las variables utilizando
var_dump().
No te limites a ejecutar el código.
Para cada caso intenta identificar:
qué ejecuta PHP, qué salida genera y qué termina interpretando el navegador.
Finalidad
Al terminar esta página deberías poder explicar…
- Por qué
echoyprintno son funciones. - Qué diferencia existe entre
echoyprint. - Para qué sirve
<?= ... ?>. - Qué diferencia existe entre strings con comillas simples y dobles.
- Qué significa interpolar una variable.
- Para qué sirven las secuencias de escape.
- Por qué
\ny<br>no son equivalentes. - Para qué utilizarías
printf(). - Qué diferencia existe entre
print_r()yvar_dump(). - Qué aporta Xdebug a
var_dump(). - Qué parte de la salida genera PHP y qué parte interpreta posteriormente el navegador.
Referencias
Documentación oficial
Heredoc vs Nowdoc
Heredoc y Nowdoc son dos formas alternativas de definir cadenas de texto (strings) en PHP.
Ambas permiten escribir cadenas multilínea, delimitadas por una etiqueta que nosotros elegimos, sin necesidad de concatenar cadenas ni introducir \n para los saltos de línea.
La principal diferencia es la interpretación de caracteres especiales:
- Heredoc: funciona como las comillas dobles (
"). Interpreta secuencias de escape e interpola variables. - Nowdoc: funciona como las comillas simples (
'). No interpola variables y trata las secuencias de escape literalmente.
Heredoc
Se utiliza <<< seguido de una etiqueta identificadora.
$nombre = "Ana";
$texto = <<<TEXTO
Hola $nombre.
Bienvenida al curso de PHP.
Esta es una cadena con varias líneas.
TEXTO;
echo $texto;Resultado:
Hola Ana.
Bienvenida al curso de PHP.
Esta es una cadena con varias líneas.Observa que $nombre se sustituye por su valor, igual que ocurre con las comillas dobles.
Nowdoc
Se utiliza <<< seguido de una etiqueta identificadora entre comillas simples.
$nombre = "Ana";
$texto = <<<'TEXTO'
Hola $nombre.
Bienvenida al curso de PHP.
Esta es una cadena con varias líneas.
TEXTO;
echo $texto;Resultado:
Hola $nombre.
Bienvenida al curso de PHP.
Esta es una cadena con varias líneas.En este caso, $nombre se muestra literalmente, sin interpolación.
¿Cuándo utilizarlos?
Son especialmente útiles para:
- Textos largos o multilínea, evitando concatenaciones.
- Sentencias SQL, que pueden ocupar varias líneas.
- Fragmentos HTML, sin necesidad de escapar las comillas dobles.
- Textos que combinan comillas simples y dobles, facilitando su escritura y lectura.
Recuerda
- Heredoc → equivale a utilizar comillas dobles (
"). - Nowdoc → equivale a utilizar comillas simples (
').
La etiqueta de apertura y la de cierre deben coincidir. La etiqueta de cierre debe comenzar al principio de una línea o tener una indentación válida, y no debe quedar más indentada que el contenido.