En PHP, las declaraciones de cadenas HEREDOC son realmente útiles para generar un bloque de html. Puede hacer que analice en variables simplemente prefijá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 llamarlo 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 puede ver, esto es un poco más complicado que solo:
$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), que podría no ser lo que quiero.
Entonces, la esencia de mi pregunta es: ¿hay una forma más elegante de abordar esto?
Edite en función de las respuestas: Ciertamente parece que algún tipo de motor de plantilla haría mi vida mucho más fácil, pero básicamente me requeriría invertir mi estilo PHP habitual. No es que eso sea algo malo, pero explica mi inercia ... Sin embargo, estoy dispuesto a encontrar formas de hacer la vida más fácil, así que estoy buscando plantillas ahora.
Text {$string1} Text {$string2} Text
en el heredoc.Respuestas:
Personalmente, no usaría HEREDOC en absoluto para esto. Simplemente no es un buen sistema de "construcción de plantillas". Todo su HTML está bloqueado en una cadena que tiene varias desventajas
Obtenga un motor de plantilla básico, o simplemente use PHP con incluye: es por eso que el lenguaje tiene los delimitadores
<?php
y?>
.template_file.php
index.php
fuente
<?=$valueToEcho;?>
o<%=$valueToEcho;%>
depende de la configuración de INI.<?=$title?>
es mucho mejor que <? Php echo $ title; ?>. La desventaja es, sí, para la distribución, muchos ini tienen etiquetas cortas. Pero , ¿adivinen qué? A partir de PHP 5.4 , las etiquetas cortas están habilitadas en PHP independientemente de la configuración de ini. Entonces, si está codificando con un requisito de 5.4+ (digamos que está usando rasgos, por ejemplo), ¡siga adelante y use esas increíbles etiquetas cortas!Si realmente desea hacer esto, pero es un poco más simple que usar una clase, puede usar:
fuente
$my_string = "Half the number of seconds since the Unix Epoch: {$fn(time() / 2 . ' Yes! Really!')}";
$fn = function fn($data) { return $data; };
$fn = function ($data) { return $data; };
$fn=function($data){return $data;};
debería ser el más cortoYo haría lo siguiente:
No estoy seguro si consideraría que esto es más elegante ...
fuente
Pruebe esto (ya sea como una variable global o instanciado cuando lo necesite):
Ahora cualquier llamada a función pasa por la
$fn
instancia. Entonces la función existentetestfunction()
se puede llamar en un heredoc con{$fn->testfunction()}
Básicamente, estamos agrupando todas las funciones en una instancia de clase y usando el
__call magic
método de PHP para asignar el método de clase a la función real que se necesita llamar.fuente
call_user_func_array
, la última vez en los comentarios en php.net: php.net/manual/en/function.call-user-func-array.php # 97473Para completar, también puede usar el truco del analizador de
!${''}
magia negra:fuente
false == ''
. Defina una variable con un nombre de longitud 0 (''
). Ajústelo al valor que desee (${''} = date('Y-m-d H:i:s', strtotime('-1 month'))
). Negarlo (!
) y convertirlo en una variable (${false}
).false
necesita convertirse en una cadena, y(string)false === ''
. Si intenta imprimir un valor falso, se producirá un error. La siguiente cadena funciona tanto en los valores Falsy Truthy y, a expensas de ser aún más ilegible:"${(${''}=date('Y-m-d H:i:s', strtotime('-1 month')))!=${''}}"
.NAN
, utilice"${(${''} = date('Y-m-d H:i:s', strtotime('-1 month')) )==NAN}"
.Llego un poco tarde, pero me lo encontré al azar. Para los futuros lectores, esto es lo que probablemente haría:
Solo usaría un búfer de salida. Entonces, básicamente, comienzas el almacenamiento en búfer usando ob_start (), luego incluyes tu "archivo de plantilla" con cualquier función, variable, etc. dentro de él, obtienes el contenido del búfer y lo escribes en una cadena, y luego cierras el búfer. Luego, ha utilizado las variables que necesita, puede ejecutar cualquier función y aún tiene el resaltado de sintaxis HTML disponible en su IDE.
Esto es lo que quiero decir:
Archivo de plantilla:
Guión:
Entonces, el script incluye template_file.php en su búfer, ejecutando cualquier función / método y asignando cualquier variable en el camino. Luego, simplemente registra el contenido del búfer en una variable y haz lo que quieras con él.
De esa manera, si no desea que se repita en la página en ese segundo, no es necesario. Puede repetir y seguir agregando a la cadena antes de enviarla.
Creo que es la mejor manera de hacerlo si no desea utilizar un motor de plantillas.
fuente
Este fragmento definirá variables con el nombre de sus funciones definidas dentro del ámbito de usuario y las vinculará a una cadena que contiene el mismo nombre. Déjame demostrarte.
Ahora funcionará.
fuente
Encontré una buena solución con función de envoltura aquí: http://blog.nazdrave.net/?p=626
fuente
Creo que usar heredoc es excelente para generar código HTML. Por ejemplo, encuentro lo siguiente casi completamente ilegible.
Sin embargo, para lograr la simplicidad, se ve obligado a evaluar las funciones antes de comenzar. No creo que sea una restricción tan terrible, ya que al hacerlo, terminas separando tu cálculo de la pantalla, lo que suele ser una buena idea.
Creo que lo siguiente es bastante legible:
Desafortunadamente, aunque fue una buena sugerencia que hizo en su pregunta vincular la función a una variable, al final, agrega un nivel de complejidad al código, que no vale la pena, y hace que el código sea menos legible, que es la principal ventaja de heredoc.
fuente
Echaría un vistazo a Smarty como un motor de plantillas; no he probado ningún otro yo mismo, pero me ha funcionado bien.
Si quería seguir con su enfoque actual sin plantillas, ¿qué tiene de malo el almacenamiento en búfer de salida? Le dará mucha más flexibilidad que tener que declarar variables que son los nombres de cadena de las funciones que desea llamar.
fuente
te estás olvidando de la función lambda:
También puede utilizar la función create_function
fuente
Un poco tarde pero aún así. ¡Esto es posible en heredoc!
Eche un vistazo en el manual de php, sección "Sintaxis compleja (rizada)"
fuente
Aquí un buen ejemplo usando la propuesta de @CJDennis:
Por ejemplo, un buen uso de la sintaxis HEREDOC es generar formularios enormes con una relación maestro-detalle en una base de datos. Se puede usar la función HEREDOC dentro de un control FOR, agregando un sufijo después de cada nombre de campo. Es una tarea típica del lado del servidor.
fuente
Los chicos deben tener en cuenta que también funciona con cadenas entre comillas dobles.
http://www.php.net/manual/en/language.types.string.php
Interesante consejo de todos modos.
fuente
fuente
deberías probarlo . después de finalizar el ETO; comando debe dar una entrada.
fuente
Esto es un poco más elegante hoy en php 7.x
fuente