Apuntes php

PHP: Porque a veces necesitas un poco de caos en tu vida.

Lección: 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
declare(strict_types=1);

$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 caracteres (por ejemplo, TEXTO, ABC123), siempre que no aparezca en el texto. - Usa constantes para identificadores comunes:

<?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
declare(strict_types=1);

$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 (como FileZilla) manejan correctamente los finales de línea (\n). Usa modo de transferencia ASCII si trabajas con servidores antiguos.

  • Expresiones en heredoc: Soporta variables complejas:

<?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']}";
  • Acepta expresiones simples:
$edad = 25;
echo "En 5 años tendrás {$edad + 5} años.";

Usa {$var} cuando necesites precisión, claridad o para acceder a estructuras complejas. En casos simples, $var es suficiente.

TOP