Menu

Heredoc y nowdoc en PHP: cadenas de varias líneas

Un heredoc en PHP es una cadena de varias líneas que empieza con <<<EOT y termina con EOT; sustituye variables igual que una cadena entre comillas dobles. Un nowdoc, <<<'EOT', conserva el texto tal cual. Aprende la sintaxis, las reglas de indentación, la interpolación de arrays y objetos y las plantillas HTML.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Un heredoc es una cadena de varias líneas. Empiézalo con <<<EOT, escribe el texto en las líneas siguientes y termínalo con EOT; en su propia línea. Las variables de dentro se sustituyen como en una cadena entre comillas dobles.

El identificador (aquí EOT) es una letra o un guion bajo seguido de letras, dígitos o guiones bajos. Se suelen elegir nombres que digan qué es el texto: HTML, SQL, TEXT. Algunos editores, entre ellos PhpStorm, resaltan el cuerpo en ese lenguaje cuando el nombre es HTML o SQL.

Crear una plantilla HTML con heredoc

Heredoc es la forma más clara de escribir un bloque de HTML con valores dentro, porque el marcado conserva su forma y no hay que escapar nada. La salida es HTML, así que el editor la muestra en la pestaña Página.

Dos detalles de ese bloque: el elemento del array va entre llaves, {$product['name']}, y el signo de dólar literal antes del precio se escapa como \$. Cambia el nombre o añade una etiqueta y vuelve a ejecutarlo.

Los valores que vienen de los usuarios deben escaparse antes de entrar en el HTML. Consulta htmlspecialchars para saber por qué y cómo.

Nowdoc: texto sin interpolación

Un nowdoc pone el identificador entre comillas simples: <<<'EOT'. No se sustituye nada de su interior, así que los signos de dólar y las barras invertidas se quedan como están. Úsalo para ejemplos de código, expresiones regulares y cualquier texto que contenga $.

Indentar el marcador de cierre

Desde PHP 7.3 el marcador de cierre puede ir indentado, y esa indentación se elimina de cada línea del cuerpo. Así un heredoc dentro de una función o de un if puede seguir la indentación del código sin que los espacios acaben en la cadena.

La línea con json_encode hace visible el resultado carácter a carácter: se eliminaron 8 espacios de cada línea, porque el TEXT; de cierre está indentado 8 espacios.

Una línea del cuerpo con menos indentación que el marcador de cierre es un error de sintaxis:

$html = <<<HTML
  <p>Hello</p>
    HTML;
PHP Parse error:  Invalid body indentation level (expecting an indentation level of at least 4) in /home/index.php on line 3

Arrays, objetos y llamadas a métodos dentro de un heredoc

Heredoc sigue las mismas reglas que las comillas dobles. Las variables simples funcionan solas; para claves de array entre comillas, arrays anidados, propiedades y llamadas a métodos, usa llaves.

Heredoc como argumento de una función

Desde PHP 7.3 el marcador de cierre puede ir seguido de más código en la misma línea, así que un heredoc se puede pasar directamente a una función o meter en un array. Con sprintf obtienes una plantilla cuyos marcadores se rellenan después.

Error frecuente: falta el punto y coma o hay texto de más tras el marcador

El identificador de cierre debe escribirse exactamente igual que al abrir (mismas mayúsculas y minúsculas), y lo que le siga en esa línea debe tener sentido como PHP. EOT; termina una sentencia, EOT, continúa una lista de argumentos. Una letra o un dígito justo después del marcador (EOTX;) lo oculta, de modo que la cadena llega hasta el final del archivo y PHP informa de syntax error, unexpected end of file. La trampa contraria es una línea del cuerpo que empieza por el identificador seguido de un espacio o un signo de puntuación, como EOT is the marker: termina la cadena antes de tiempo y el resto de esa línea se lee como PHP (syntax error, unexpected identifier "is"). Elige un identificador que nunca aparezca al principio de una línea del texto, como HTML para marcado o SQL para una consulta.

Preguntas frecuentes

¿Qué es un heredoc en PHP?

Una forma de escribir una cadena de varias líneas sin comillas: empieza con <<<EOT y un salto de línea, escribe el texto y termina con EOT; en su propia línea. Las variables de dentro se sustituyen, exactamente igual que en una cadena entre comillas dobles, y puedes usar " y ' libremente.

¿Cuál es la diferencia entre heredoc y nowdoc?

Un heredoc (<<<EOT) sustituye variables y secuencias de escape como una cadena entre comillas dobles. Un nowdoc (<<<'EOT', con el identificador entre comillas simples) no hace ninguna de las dos cosas y conserva cada $ y cada barra invertida tal cual, como una cadena entre comillas simples.

¿Se puede indentar el marcador de cierre del heredoc?

Sí, desde PHP 7.3. La indentación del marcador de cierre se elimina de cada línea del cuerpo, así que puedes indentar un heredoc para que coincida con tu código. Cada línea del cuerpo debe estar indentada al menos tanto como el marcador de cierre, o PHP se detiene con un error de sintaxis.

¿Cómo llamo a una función dentro de un heredoc?

Heredoc solo interpola variables, elementos de array, propiedades y llamadas a métodos. Llama antes a la función y guarda el resultado, o guarda el nombre de la función o un closure en una variable y llámalo entre llaves: $e = 'htmlspecialchars'; y luego {$e($text)}.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

COMENZAR