Apuntes sobre Php

Lleva décadas en el obituario y sigue aquí.

Heredoc y Nowdoc

La sintaxis heredoc (y más tarde nowdoc) te permite volcar grandes cantidades de texto, como HTML o mensajes largos, sin preocuparte por escapar comillas o caracteres especiales. Es ideal para mejorar la legibilidad y velocidad de tus scripts.

Heredoc: Texto con expansión de variables

Heredoc te permite escribir texto que incluye comillas, variables, y saltos de línea sin necesidad de escapar caracteres. Se define con <<< seguido de un identificador (por convención, EOT o EOF), el texto, y el identificador de cierre:

<?php
$nombre = "Juan";

echo <<<EOT
Esta cadena se imprime sin problemas,
y podemos usar "comillas" sin escaparlas.
Hola, $nombre, bienvenido!
Es ideal para grandes trozos de HTML.
EOT;
?>

Salida:

Esta cadena se imprime sin problemas,
y podemos usar "comillas" sin escaparlas.
Hola, Juan, bienvenido!
Es ideal para grandes trozos de HTML.

Nota: El identificador puede ser cualquier combinación de letras, números o guiones bajos (por ejemplo, EOT, TEXTO, ABC123), siempre que no aparezca dentro del texto. El identificador de cierre debe estar solo en su línea, sin espacios ni caracteres adicionales antes del punto y coma.

<?php
const HEREDOC_ID = 'EOT';
echo <<<EOT
Texto con identificador constante.
EOT;
?>
  • La clave es que heredoc expande variables ($nombre) y expresiones complejas (por ejemplo, {$array['key']}).
  • El identificador de cierre debe estar al inicio de la línea, sin espacios, tabuladores, ni comentarios, seguido solo por un punto y coma (;).

Nowdoc: Texto sin expansión

Nowdoc es como heredoc, pero no interpreta variables ni expresiones, ideal para código literal (por ejemplo, plantillas o SQL). Usa comillas simples en el identificador (<<<'EOT'):

<?php
$nombre = "Juan";

echo <<<'EOT'
Esta cadena no expande $nombre.
Perfecto para código literal, como "plantillas".
EOT;
?>

Salida:

Esta cadena no expande $nombre.
Perfecto para código literal, como "plantillas".

Reglas importantes

  • Identificador de cierre: Debe estar solo en su línea, sin espacios ni caracteres adicionales (excepto ;).
  • Compatibilidad: Los editores modernos y clientes FTP manejan correctamente los finales de línea. Si trabajas con servidores antiguos, usa modo de transferencia ASCII.
  • Expresiones en heredoc: Soporta acceso a variables complejas como arrays:
<?php
$datos = ['nombre' => 'Ana'];
echo <<<EOT
Hola, {$datos['nombre']}!
EOT;
?>
  • Casting: Fuerza el tipo de variables para seguridad:
<?php
$edad = 25; // De una fuente externa
echo <<<EOT
Edad: {(int)$edad} años
EOT;
?>

Comparación: Heredoc, Nowdoc, y comillas dobles

Característica Heredoc Nowdoc Comillas dobles
Expande variables No
Soporta expresiones Sí ({$var}) No Sí ({$var})
Ideal para HTML, texto largo Código literal Cadenas cortas
Escapar comillas No necesario No necesario Necesario
Legibilidad multilineal Excelente Excelente Pobre

Ejemplo con comillas dobles (menos legible):

<?php
$usuario = "María";
echo "<h1>Hola, $usuario</h1>\n<p>Bienvenida</p>";
?>

Ventajas de heredoc y nowdoc

  • Legibilidad: Fácil de escribir y leer, especialmente para HTML o texto largo.
  • Velocidad: Reduce operaciones de concatenación, mejorando el rendimiento.
  • Flexibilidad: Heredoc para texto dinámico, nowdoc para texto estático.

¿Por qué usar {$var} en heredoc?

Aunque en la mayoría de los casos puedes usar variables directamente ($nombre, $edad), encerrar la variable entre llaves {} aporta claridad y funcionalidad extra:

  • Evita ambigüedades cuando añades texto justo después de la variable:
$nombre = "Lucía";
echo "Hola $nombreMundo";     // Incorrecto: busca $nombreMundo
echo "Hola {$nombre}Mundo";   // Correcto: imprime "Hola LucíaMundo"
  • Permite acceder a arrays, objetos o caracteres de forma mas clara:
$persona = ["nombre" => "Ana"];
echo "Hola {$persona['nombre']}";

Usa {$var} cuando necesites precisión o acceder a estructuras como arrays. Para expresiones aritméticas, calcula el valor en una variable primero:

$edad = 25;
$en_cinco = $edad + 5;
echo "En 5 años tendrás {$en_cinco} años.";

En casos simples con una variable directa, $var sin llaves es suficiente.

Recapitulación

  • Heredoc (<<<EOT ... EOT;) permite escribir texto multilínea con interpolación de variables, sin escapar comillas.
  • Nowdoc (<<<'EOT' ... EOT;) es igual pero sin interpolación: muestra el texto tal cual, ideal para plantillas o código literal.
  • El identificador de cierre debe estar solo en su línea, sin espacios ni caracteres antes del punto y coma.
  • Usa {$var} para evitar ambigüedades y para acceder a arrays dentro de heredoc/strings.
  • PHP no evalúa expresiones aritméticas dentro de {}: calcula el valor en una variable antes de interpolarlo.

En la próxima lección: cómo incluir archivos en PHP: include, require y sus variantes _once.

TOP