variable una recorrer extraer escapar ejemplos dentro comillas caracteres cadena php string heredoc

una - recorrer string php



Llamar a funciones PHP dentro de cadenas HEREDOC (16)

Aquí un buen ejemplo usando la propuesta @CJDennis:

function double($i) { return $i*2; } function triple($i) { return $i*3;} $tab = ''double''; echo "{$tab(5)} is $tab 5<br>"; $tab = ''triple''; echo "{$tab(5)} is $tab 5<br>";

Por ejemplo, un buen uso de la sintaxis de HEREDOC es generar formas enormes con una relación maestro-detalle en una base de datos. Uno 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.

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

En PHP 5, es posible realizar llamadas a funciones dentro de {} llaves dentro de una cadena HEREDOC, pero debe pasar un poco de trabajo. 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 simplemente:

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

Hay otras formas además del primer ejemplo de código, como salir de 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 la secuencia 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?

Edición basada en respuestas: Ciertamente parece que algún tipo de motor de plantillas facilitaría mi vida, pero me requeriría básicamente invertir mi estilo PHP habitual. No es que sea algo malo, pero explica mi inercia. Sin embargo, estoy dispuesto a encontrar la forma de facilitar la vida, así que ahora estoy buscando plantillas.


Creo que usar heredoc es excelente para generar código HTML. Por ejemplo, creo que los siguientes son casi completamente ilegibles.

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

Sin embargo, para lograr la simplicidad, usted está obligado a evaluar las funciones antes de comenzar. No creo que sea una restricción tan terrible, ya que al hacerlo, terminas separando tu computación de la pantalla, que generalmente es una buena idea.

Creo que lo siguiente es bastante legible:

$page_content = getPageContent(); print <<<END <html> <head> <title>$page_title</title> </head> <body> $page_content </body> END;

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, lo cual es la principal ventaja de heredoc.


Echaré un vistazo a Smarty como motor de plantillas. No he probado ninguna otra, pero me ha ido bien.

Si desea 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 clave de las funciones que desea llamar.


Este fragmento definirá las variables con el nombre de sus funciones definidas en userscope y las vinculará a una cadena que contenga el mismo nombre. Déjame demostrar.

function add ($int) { return $int + 1; } $f=get_defined_functions();foreach($f[user]as$v){$$v=$v;} $string = <<< heredoc plain text and now a function: {$add(1)} heredoc;

Ahora funcionará


Estoy un poco tarde, pero me encontré al azar. Para cualquier lector futuro, esto es lo que probablemente haría:

Solo usaría un buffer de salida. Entonces, básicamente, comienza el almacenamiento en búfer usando ob_start (), luego incluye su "archivo de plantilla" con cualquier función, variable, etc. dentro de él, obtiene el contenido del búfer y lo escribe en una cadena, y luego cierra 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:

<?php echo "plain text and now a function: " . testfunction(); ?>

Guión:

<?php ob_start(); include "template_file.php"; $output_string = ob_get_contents(); ob_end_clean(); echo $output_string; ?>

Por lo tanto, el script incluye template_file.php en su buffer, ejecutando cualquier función / método y asignando cualquier variable en el camino. Luego simplemente registra los contenidos del búfer en una variable y hace lo que quiera con ella.

De esa forma, si no desea hacer eco en la página en ese segundo, no es necesario. Puede repetir y seguir añadiendo a la cadena antes de enviarla.

Creo que es la mejor manera de hacerlo si no quieres utilizar un motor de plantillas.



No usaría HEREDOC en absoluto para esto, personalmente. Simplemente no representa un buen sistema de "creación de plantillas". Todo tu HTML está bloqueado en una cadena que tiene varias desventajas

  • No hay opción para WYSIWYG
  • Sin finalización de código para HTML desde IDEs
  • Salida (HTML) bloqueada a archivos lógicos
  • Terminas teniendo que usar hacks como lo que estás tratando de hacer ahora para lograr plantillas más complejas, como bucles

Obtenga un motor de plantillas básico, o simplemente use PHP con includes. Es por eso que el lenguaje tiene los delimitadores <?php y ?> .

template_file.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'');


Para completar, también puedes usar la magia negra de !${''''} :

echo <<<EOT One month ago was ${!${''''} = date(''Y-m-d H:i:s'', strtotime(''-1 month''))}. EOT;


Pruebe esto (ya sea como una variable global o instanciada cuando lo necesite):

<?php class Fn { public function __call($name, $args) { if (function_exists($name)) { return call_user_func_array($name, $args); } } } $fn = new Fn(); ?>

Ahora cualquier llamada de función pasa por la instancia de $fn . Entonces, la función de testfunction() existente testfunction() puede testfunction() en un heredoc con {$fn->testfunction()}

Básicamente estamos envolviendo todas las funciones en una instancia de clase, y usando el método de __call magic de PHP para mapear el método de clase a la función real que necesita ser llamada.


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;



Yo haría lo siguiente:

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

No estoy seguro de si consideraría esto como más elegante ...


encontré una buena solución con la función de envolver aquí: http://blog.nazdrave.net/?p=626

function heredoc($param) { // just return whatever has been passed to us return $param; } $heredoc = ''heredoc''; $string = <<<HEREDOC /$heredoc is now a generic function that can be used in all sorts of ways: Output the result of a function: {$heredoc(date(''r''))} Output the value of a constant: {$heredoc(__FILE__)} Static methods work just as well: {$heredoc(MyClass::getSomething())} 2 + 2 equals {$heredoc(2+2)} HEREDOC; // The same works not only with HEREDOC strings, // but with double-quoted strings as well: $string = "{$heredoc(2+2)}";


te estás olvidando de la función lambda:

$or=function($c,$t,$f){return$c?$t:$f;}; echo <<<TRUEFALSE The best color ever is {$or(rand(0,1),''green'',''black'')} TRUEFALSE;

También podría usar la función create_function


<?php echo <<<ETO <h1>Hellow ETO</h1> ETO;

deberías probarlo . después de terminar el ETO; comando que debe dar una entrada.


<div><?=<<<heredoc Use heredoc and functions in ONE statement. Show lower case ABC=" heredoc . strtolower(''ABC'') . <<<heredoc ". And that is it! heredoc ?></div>