Llamar a funciones PHP dentro de cadenas HEREDOC

Resuelto Doug Kavendek asked hace 54 años • 18 respuestas

En PHP, las declaraciones de cadenas HEREDOC son realmente útiles para generar un bloque de html. Puede hacer que analice variables simplemente anteponiéndolas con $, pero para una sintaxis más complicada (como $var[2][3]), debe poner su expresión entre llaves {}.

En PHP 5, es posible realizar llamadas a funciones entre llaves {} dentro de una cadena HEREDOC, pero hay que trabajar un poco. El nombre de la función en sí debe almacenarse en una variable y debe llamarla como si fuera una función con nombre dinámico. Por ejemplo:

$fn = 'testfunction';
function testfunction() { return 'ok'; }
$string = <<< heredoc
plain text and now a function: {$fn()}
heredoc;

Como puedes ver, esto es un poco más complicado que simplemente:

$string = <<< heredoc
plain text and now a function: {testfunction()}
heredoc;

Hay otras formas además del primer ejemplo de código, como salir del HEREDOC para llamar a la función o revertir el problema y hacer algo como:

?>
<!-- directly output html and only breaking into php for the function -->
plain text and now a function: <?PHP print testfunction(); ?>

Este último tiene la desventaja de que la salida se coloca directamente en el flujo de salida (a menos que esté usando el almacenamiento en búfer de salida), lo que podría no ser lo que quiero.

Entonces, la esencia de mi pregunta es: ¿hay una forma más elegante de abordar esto?

Editar según las respuestas: Ciertamente parece que algún tipo de motor de plantillas me haría la vida mucho más fácil, pero básicamente requeriría que invirtiera mi estilo PHP habitual. No es que eso sea malo, pero explica mi inercia. Sin embargo, estoy dispuesto a descubrir formas de hacer la vida más fácil, así que ahora estoy buscando plantillas.

Doug Kavendek avatar Jan 01 '70 08:01 Doug Kavendek
Aceptado

Si realmente quieres hacer esto pero un poco más simple que usar una clase, puedes usar:

function fn($data) {
  return $data;
}
$fn = 'fn';

$my_string = <<<EOT
Number of seconds since the Unix Epoch: {$fn(time())}
EOT;
CJ Dennis avatar May 23 '2012 04:05 CJ Dennis

Personalmente, no usaría HEREDOC en absoluto para esto. Simplemente no es un buen sistema de "construcción de plantillas". Todo tu HTML está encerrado en una cadena que tiene varias desventajas.

  • No hay opción para WYSIWYG
  • No se completa el código para HTML desde IDE
  • Salida (HTML) bloqueada en archivos lógicos
  • Terminas teniendo que usar trucos como el que estás intentando hacer ahora para lograr plantillas más complejas, como bucles.

Obtenga un motor de plantillas básico o simplemente use PHP con inclusiones; es por eso que el lenguaje tiene delimitadores <?phpy ?>.

archivo_plantilla.php

<html>
<head>
  <title><?php echo $page_title; ?></title>
</head>
<body>
  <?php echo getPageContent(); ?>
</body>

index.php

<?php

$page_title = "This is a simple demo";

function getPageContent() {
    return '<p>Hello World!</p>';
}

include('template_file.php');
Peter Bailey avatar Sep 19 '2008 19:09 Peter Bailey

Yo haría lo siguiente:

$string = <<< heredoc
plain text and now a function: %s
heredoc;
$string = sprintf($string, testfunction());

No estoy seguro si considerarías que esto es más elegante...

boxxar avatar Sep 19 '2008 18:09 boxxar