Question

En PHP, les déclarations de chaîne HEREDOC sont très utiles pour générer un bloc de code HTML.Vous pouvez le faire analyser dans les variables simplement en les préfixant avec $, mais pour une syntaxe plus compliquée (comme $var[2][3]), vous devez mettre votre expression entre accolades {}.

En PHP 5, il est Il est possible de faire des appels de fonction entre {} accolades à l'intérieur d'une chaîne HEREDOC, mais vous devez faire un peu de travail.Le nom de la fonction lui-même doit être stocké dans une variable et vous devez l'appeler comme s'il s'agissait d'une fonction nommée dynamiquement.Par exemple:

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

Comme vous pouvez le voir, c'est un peu plus compliqué que simplement :

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

Il existe d'autres moyens que le premier exemple de code, comme sortir du HEREDOC pour appeler la fonction, ou inverser le problème et faire quelque chose comme :

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

Ce dernier présente l'inconvénient que la sortie est directement placée dans le flux de sortie (sauf si j'utilise la mise en mémoire tampon de sortie), ce qui n'est peut-être pas ce que je souhaite.

Donc, l'essence de ma question est la suivante :existe-t-il une manière plus élégante d’aborder cela ?

Modifier en fonction des réponses : Il semble certainement qu'une sorte de moteur de modèles me rendrait la vie beaucoup plus facile, mais cela nécessiterait que j'inverse fondamentalement mon style PHP habituel.Ce n'est pas une mauvaise chose, mais cela explique mon inertie.Cependant, je suis prêt à trouver des moyens de rendre la vie plus facile, alors j'étudie des modèles maintenant.

Était-ce utile?

La solution

Je n’utiliserais pas HEREDOC du tout pour cela, personnellement. Cela ne fait tout simplement pas un bon & "Modèle de construction &"; système. Tout votre code HTML est verrouillé dans une chaîne qui présente plusieurs inconvénients

  • Aucune option pour WYSIWYG
  • Pas de code pour HTML à partir d'EDI
  • La sortie (HTML) est verrouillée dans les fichiers logiques
  • Vous finissez par avoir à utiliser des hacks, comme ce que vous essayez de faire maintenant, pour créer des modèles plus complexes, tels que la mise en boucle

Obtenez un moteur de template de base, ou utilisez simplement PHP avec includes - c’est la raison pour laquelle le langage utilise les délimiteurs <?php et ?>.

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

Autres conseils

Si vous voulez vraiment faire cela, mais un peu plus simplement que d'utiliser une classe, vous pouvez utiliser:

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

$my_string = <<<EOT
Number of seconds since the Unix Epoch: {$fn(time())}
EOT;

Je voudrais faire ce qui suit:

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

Je ne suis pas sûr que vous trouviez cela plus élégant ...

Essayez ceci (en tant que variable globale ou instanciée quand vous en avez besoin):

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

  $fn = new Fn();
?>

Désormais, tout appel de fonction passe par l'instance $fn. Donc, la fonction existante testfunction() peut être appelée dans un heredoc avec {$fn->testfunction()}

Fondamentalement, nous encapsulons toutes les fonctions dans une instance de classe et utilisons la méthode __call magic de PHP pour mapper la méthode de classe sur la fonction devant être appelée.

Je suis un peu en retard, mais je suis tombé dessus au hasard. Pour tous les futurs lecteurs, voici ce que je ferais probablement:

Je voudrais juste utiliser un tampon de sortie. Donc, en gros, vous commencez la mise en mémoire tampon en utilisant ob_start (), puis vous incluez votre & Quot; fichier modèle & Quot; avec toutes les fonctions, variables, etc. à l'intérieur, récupérez le contenu du tampon, écrivez-le dans une chaîne, puis fermez le tampon. Ensuite, vous avez utilisé les variables dont vous avez besoin, vous pouvez exécuter n’importe quelle fonction et la surbrillance de la syntaxe HTML est toujours disponible dans votre IDE.

Voici ce que je veux dire:

Fichier de modèle:

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

Script:

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

Le script inclut donc le fichier template_file.php dans son tampon, exécute les fonctions / méthodes et attribue les variables le long du chemin. Ensuite, vous enregistrez simplement le contenu du tampon dans une variable et faites ce que vous voulez.

Ainsi, si vous ne voulez pas que cela se répète sur la page à la seconde, vous n’êtes pas obligé. Vous pouvez boucler et continuer à ajouter à la chaîne avant de la sortir.

Je pense que c'est la meilleure solution si vous ne souhaitez pas utiliser de moteur de templates.

Pour être complet, vous pouvez également utiliser la !${''} magie noire parser hack :

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

Cet extrait définira des variables avec le nom de vos fonctions définies dans la portée utilisateur et les liera à une chaîne contenant le même nom.Laissez-moi vous démontrer.

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;

Va maintenant fonctionner.

Je pense que l'utilisation d'Heredoc est très utile pour générer du code HTML. Par exemple, je trouve ce qui suit presque complètement illisible.

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

Cependant, pour atteindre la simplicité, vous devez évaluer les fonctions avant de commencer. Je ne crois pas que ce soit une contrainte aussi terrible, car en fin de compte, vous séparez votre calcul de l'affichage, ce qui est généralement une bonne idée.

Je pense que ce qui suit est assez lisible:

$page_content = getPageContent();

print <<<END
<html>
<head>
  <title>$page_title</title>
</head>
<body>
$page_content
</body>
END;

Malheureusement, bien que vous ayez suggéré dans votre question de lier la fonction à une variable, cela ajoute un niveau de complexité au code, ce qui ne vaut pas la peine, et rend le code moins lisible. , qui est l’atout majeur d’Hérédoc.

a trouvé une solution intéressante avec la fonction d'emballage ici: 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)}";

Je jetterais un coup d'oeil à Smarty en tant que moteur de modèle - je n'ai essayé aucun autre modèle. moi-même, mais cela m’a bien réussi.

Si vous souhaitez conserver vos modèles sans d’approche actuelle, quel est le problème avec la mise en mémoire tampon de la sortie? Cela vous donnera beaucoup plus de flexibilité que de devoir déclarer des variables, qui sont les noms sting des fonctions que vous souhaitez appeler.

Un peu tard mais quand même. C'est possible dans Heredoc!

Consultez la page le manuel php, section & "Syntaxe complexe (frisée) &";

Voici un bel exemple utilisant la proposition @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>";

Par exemple, une bonne utilisation de la syntaxe HEREDOC est de générer d’énormes formulaires avec une relation maître-détail dans une base de données. On peut utiliser la fonction HEREDOC dans un champ FOR en ajoutant un suffixe après chaque nom de champ. C’est une tâche typique côté serveur.

vous oubliez la fonction lambda:

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

Vous pouvez également utiliser la fonction create_function

Les gars doivent noter qu'il fonctionne également avec des chaînes entre guillemets.

http://www.php.net/manual/en /language.types.string.php

Un conseil intéressant quand même.

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

vous devriez l'essayer. après la fin de l'ETO; commande, vous devez donner une entrée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top