En PHP, les déclarations de chaînes HEREDOC sont vraiment utiles pour sortir un bloc de 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 possible de faire des appels de fonction entre {} accolades dans 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 en plus du 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 a 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 veux.
Donc, l'essence de ma question est: y a-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èle me simplifierait la vie, mais il me faudrait essentiellement inverser mon style PHP habituel. Ce n'est pas que ce soit une mauvaise chose, mais cela explique mon inertie. Je suis prêt à trouver des moyens de rendre la vie plus facile, alors je cherche des modèles maintenant.
Text {$string1} Text {$string2} Text
dans l'hérédoc.Réponses:
Je n'utiliserais pas du tout HEREDOC pour cela, personnellement. Cela ne fait tout simplement pas un bon système de "création de modèles". Tout votre HTML est verrouillé dans une chaîne qui présente plusieurs inconvénients
Obtenez un moteur de modèle de base, ou utilisez simplement PHP avec des inclusions - c'est pourquoi le langage a les délimiteurs
<?php
et?>
.template_file.php
index.php
la source
<?=$valueToEcho;?>
ou en<%=$valueToEcho;%>
fonction de vos paramètres INI.<?=$title?>
c'est beaucoup plus agréable que <? Php echo $ title; ?>. L'inconvénient est, oui, pour la distribution, de nombreux ini ont des balises courtes. Mais devinez quoi ?? Depuis PHP 5.4 , les balises courtes sont activées dans PHP indépendamment des paramètres ini! Donc, si vous codez avec une exigence 5.4+ (disons que vous utilisez des traits, par exemple), allez-y et utilisez ces superbes balises courtes !!Si vous voulez vraiment faire cela mais un peu plus simple que d'utiliser une classe, vous pouvez utiliser:
la source
$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;};
rhis devrait être le plus courtJe ferais ce qui suit:
Je ne sais pas si vous considérez cela comme plus élégant ...
la source
Essayez ceci (soit en tant que variable globale, soit instanciée lorsque vous en avez besoin):
Maintenant, tout appel de fonction passe par l'
$fn
instance. Ainsi, la fonction existantetestfunction()
peut être appelée dans un heredoc avec{$fn->testfunction()}
Fondamentalement, nous enveloppons toutes les fonctions dans une instance de classe et utilisons la
__call magic
méthode PHP pour mapper la méthode de classe à la fonction réelle à appeler.la source
call_user_func_array
dernière fois dans les commentaires sur php.net: php.net/manual/en/function.call-user-func-array.php # 97473Pour être complet, vous pouvez également utiliser le hack parseur de
!${''}
magie noire:la source
false == ''
. Définissez une variable avec un nom de longueur 0 (''
). Réglez-le sur la valeur souhaitée (${''} = date('Y-m-d H:i:s', strtotime('-1 month'))
). Niez-le (!
) et convertissez-le en une variable (${false}
).false
doit être converti en une chaîne, et(string)false === ''
. Si vous essayez d'imprimer une valeur erronée, une erreur se produira à la place. La chaîne suivante fonctionne aussi bien sur truthy et les valeurs falsy, au détriment d'être encore plus illisible:"${(${''}=date('Y-m-d H:i:s', strtotime('-1 month')))!=${''}}"
.NAN
, utilisez"${(${''} = date('Y-m-d H:i:s', strtotime('-1 month')) )==NAN}"
.Je suis un peu en retard, mais je suis tombé dessus au hasard. Pour tous les futurs lecteurs, voici ce que je ferais probablement:
J'utiliserais simplement un tampon de sortie. Donc, fondamentalement, vous démarrez la mise en mémoire tampon en utilisant ob_start (), puis incluez votre "fichier modèle" avec toutes les fonctions, variables, etc. à l'intérieur, récupérez le contenu du tampon et écrivez-le dans une chaîne, puis fermez le tampon. Ensuite, vous avez utilisé toutes les variables dont vous avez besoin, vous pouvez exécuter n'importe quelle fonction et vous avez toujours la coloration syntaxique HTML disponible dans votre IDE.
Voici ce que je veux dire:
Fichier modèle:
Scénario:
Ainsi, le script inclut le template_file.php dans sa mémoire tampon, exécutant toutes les fonctions / méthodes et affectant toutes les variables en cours de route. Ensuite, vous enregistrez simplement le contenu du tampon dans une variable et faites ce que vous voulez avec.
De cette façon, si vous ne voulez pas faire écho sur la page à cette seconde, vous n'êtes pas obligé de le faire. Vous pouvez boucler et continuer à ajouter à la chaîne avant de la sortir.
Je pense que c'est la meilleure façon de procéder si vous ne voulez pas utiliser un moteur de création de modèles.
la source
Cet extrait de code définira des variables avec le nom de vos fonctions définies dans userscope et les liera à une chaîne qui contient le même nom. Laissez-moi vous démontrer.
Va maintenant fonctionner.
la source
trouvé une solution intéressante avec la fonction d'emballage ici: http://blog.nazdrave.net/?p=626
la source
Je pense que l'utilisation d'heredoc est idéale pour générer du code HTML. Par exemple, je trouve ce qui suit presque complètement illisible.
Cependant, afin d'obtenir la simplicité, vous êtes obligé d'évaluer les fonctions avant de commencer. Je ne pense pas que ce soit une contrainte aussi terrible, car ce faisant, vous finissez par séparer votre calcul de l'affichage, ce qui est généralement une bonne idée.
Je pense que ce qui suit est assez lisible:
Malheureusement, même si c'était une bonne suggestion que vous avez faite dans votre question de lier la fonction à une variable, au final, cela ajoute un niveau de complexité au code, ce qui ne vaut pas la peine, et le rend moins lisible, ce qui est l'avantage majeur d'heredoc.
la source
Je jetterais un œil à Smarty en tant que moteur de modèle - je n'en ai pas essayé d'autres moi-même, mais cela m'a bien fonctionné.
Si vous vouliez vous en tenir à votre approche actuelle sans modèles, qu'est-ce qui est si mauvais dans la mise en mémoire tampon de sortie? Cela vous donnera beaucoup plus de flexibilité que d'avoir à déclarer des variables qui sont les noms de chaîne des fonctions que vous souhaitez appeler.
la source
vous oubliez la fonction lambda:
Vous pouvez également utiliser la fonction create_function
la source
Un peu tard mais quand même. C'est possible dans heredoc!
Jetez un œil dans le manuel php, section "Syntaxe complexe (bouclée)"
la source
Voici un bel exemple utilisant la proposition @CJDennis:
Par exemple, une bonne utilisation de la syntaxe HEREDOC est de générer des formulaires volumineux avec une relation maître-détails dans une base de données. On peut utiliser la fonction HEREDOC dans un contrôle FOR, en ajoutant un suffixe après chaque nom de champ. C'est une tâche typique du côté serveur.
la source
Les gars doivent noter que cela fonctionne également avec des chaînes entre guillemets.
http://www.php.net/manual/en/language.types.string.php
Conseil intéressant quand même.
la source
la source
tu devrais l'essayer . après la fin de l'ETO; commande, vous devez donner une entrée.
la source
C'est un peu plus élégant aujourd'hui sur php 7.x
la source