PHP-functionen innerhalb von HEREDOC-Strings aufrufen

In PHP sind die HEREDOC-String-Deklarationen sehr nützlich, um einen HTML-Block auszugeben. Sie können es in Variablen parsen lassen, indem Sie ihnen $ voranstellen, aber für kompliziertere Syntax (wie $ var [2] [3]) müssen Sie Ihren Ausdruck in {} geschweifte Klammern setzen.

In PHP 5 ist es möglich, functionsaufrufe innerhalb von {} geschweiften Klammern innerhalb einer HEREDOC-Zeichenkette auszuführen, aber Sie müssen ein wenig Arbeit erledigen. Der functionsname selbst muss in einer Variablen gespeichert werden, und Sie müssen ihn wie eine dynamisch benannte function aufrufen. Beispielsweise:

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

Wie Sie sehen können, ist dies ein bisschen chaotischer als nur:

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

Es gibt andere Wege neben dem ersten Codebeispiel, z. B. das Ausbrechen aus dem HEREDOC, um die function aufzurufen, oder das Umkehren des Problems und das Ausführen von etwas wie:

 ?>  plain text and now a function:  

Letzteres hat den Nachteil, dass die Ausgabe direkt in den Ausgabestrom eingefügt wird (es sei denn, ich verwende Ausgabepufferung), was möglicherweise nicht das ist, was ich möchte.

Das Wesentliche meiner Frage ist also: Gibt es einen eleganteren Weg, dies zu erreichen?

Editieren basierend auf Antworten: Es sieht so aus, als ob eine Art Template-Engine mein Leben viel einfacher machen würde, aber es würde bedeuten, dass ich meinen üblichen PHP-Stil grundsätzlich umkehren würde. Nicht, dass das eine schlechte Sache wäre, aber es erklärt meine Trägheit. Ich bin auf der Suche nach Möglichkeiten, das Leben einfacher zu machen, also schaue ich jetzt in Vorlagen.

   

Ich würde HEREDOC dafür überhaupt nicht benutzen. Es macht einfach kein gutes “Template-Building” -System. All Ihre HTML ist in einer Zeichenfolge gesperrt, die mehrere Nachteile hat

  • Keine Option für WYSIWYG
  • Keine Code-Vervollständigung für HTML von IDEs
  • Ausgabe (HTML) zu logischen Dateien gesperrt
  • Am Ende müssen Sie Hacks verwenden, wie Sie es jetzt tun, um komplexere Vorlagen zu erhalten, z. B. Schleifen

Holen Sie sich eine grundlegende Template-Engine oder verwenden Sie einfach PHP mit Includes – deshalb hat die Sprache die Trennzeichen < ?php und ?> .

Vorlage_Datei.php

   < ?php echo $page_title; ?>   < ?php echo getPageContent(); ?>  

index.php

 < ?php $page_title = "This is a simple demo"; function getPageContent() { return '

Hello World!'; } include('template_file.php');

Wenn Sie das wirklich tun wollen, aber ein bisschen einfacher als die Verwendung einer class, können Sie Folgendes verwenden:

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

Ich würde folgendes tun:

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

Nicht sicher, ob Sie das für eleganter halten würden ...

Versuchen Sie es (entweder als globale Variable oder instanziiert, wenn Sie es benötigen):

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

Nun geht jeder functionsaufruf durch die $fn Instanz. So kann die bestehende function testfunction() in einem heredoc mit {$fn->testfunction()}

Im Grunde genommen wickeln wir alle functionen in eine classninstanz ein und verwenden die __call magic Methode von PHP, um die classnmethode der tatsächlich aufgerufenen function __call magic .

Ich bin ein bisschen spät dran, aber zufällig bin ich darauf gestoßen. Für zukünftige Leser würde ich Folgendes tun:

Ich würde nur einen Ausgabepuffer verwenden. Im Grunde genommen starten Sie die Pufferung mit ob_start (), fügen dann Ihre “Vorlagendatei” mit beliebigen functionen, Variablen usw. darin ein, holen den Inhalt des Puffers und schreiben ihn in eine Zeichenkette und schließen dann den Puffer. Dann haben Sie alle Variablen verwendet, die Sie benötigen, Sie können jede function ausführen, und Sie haben immer noch die HTML-Syntaxhervorhebung in Ihrer IDE verfügbar.

Folgendes meine ich:

Vorlagendatei:

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

Skript:

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

Daher enthält das Skript die Datei template_file.php in seinem Puffer, führt alle functionen / Methoden aus und weist alle Variablen zu. Dann notieren Sie einfach den Inhalt des Puffers in eine Variable und machen damit, was Sie wollen.

Auf diese Weise müssen Sie es nicht tun, wenn Sie es in dieser Sekunde nicht auf der Seite wiedergeben möchten. Sie können die Zeichenfolge vor dem Ausgeben wiederholen und hinzufügen.

Ich denke, das ist der beste Weg, wenn Sie keine Template-Engine verwenden möchten.

Der Vollständigkeit halber kannst du auch die !${''} Schwarze Magie verwenden:

 echo < < 

Dieser Ausschnitt definiert Variablen mit dem Namen Ihrer definierten functionen innerhalb von userscope und bindet sie an eine Zeichenfolge, die denselben Namen enthält. Lass mich demonstrieren.

 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; 

Wird jetzt funktionieren.

Ich denke, die Verwendung von heredoc eignet sich hervorragend zum Generieren von HTML-Code. Zum Beispiel finde ich das folgende fast vollständig unlesbar.

   < ?php echo $page_title; ?>   < ?php echo getPageContent(); ?>  

Um die Einfachheit zu erreichen, sind Sie jedoch gezwungen, die functionen vor dem Start zu bewerten. Ich glaube nicht, dass dies ein so schrecklicher Zwang ist, da Sie dadurch Ihre Berechnung von der Anzeige trennen, was normalerweise eine gute Idee ist.

Ich denke, das Folgende ist gut lesbar:

 $page_content = getPageContent(); print < <  $page_title   $page_content  END; 

Leider, obwohl es ein guter Vorschlag war, in Ihrer Frage die function an eine Variable zu binden, fügt sie dem Code letztendlich eine Komplexitätsebene hinzu, die nicht wert ist und den Code weniger lesbar macht der große Vorteil von heredoc.

Ich würde mir Smarty als Template-Engine ansehen – ich habe noch keine anderen selbst getestet, aber es hat mir gut getan.

Wenn Sie Ihren aktuellen Ansatz ohne Vorlagen beibehalten möchten, was ist so schlecht an der Pufferung von Ausgaben? Es gibt Ihnen viel mehr Flexibilität, als Variablen deklarieren zu müssen, die die Namen der functionen sind, die Sie aufrufen möchten.

nette Lösung mit Wrapping-function hier gefunden: http://blog.nazdrave.net/?p=626

 function heredoc($param) { // just return whatever has been passed to us return $param; } $heredoc = 'heredoc'; $string = < < 

Ein bisschen spät, aber immer noch. Dies ist in heredoc möglich!

Sehen Sie im PHP-Handbuch nach, Abschnitt “Komplexe (lockige) Syntax”

Hier ein schönes Beispiel mit @CJDennis-Vorschlag:

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

Zum Beispiel kann eine gute Verwendung der HEREDOC-Syntax große Formulare mit einer Master-Detail-Beziehung in einer database erzeugen. Man kann die HEREDOC-function in einem FOR-Steuerelement verwenden und nach jedem Feldnamen ein Suffix hinzufügen. Es ist eine typische serverseitige Aufgabe.

Sie vergessen Lambda-function:

 $or=function($c,$t,$f){return$c?$t:$f;}; echo < < 

Sie könnten auch die function create_function verwenden

Leute sollten beachten, dass es auch mit doppelt zitierten Strings funktioniert.

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

Interessanter Tipp sowieso.

 
< ?=<<
 < ?php echo <<Hellow ETO ETO; 

Du solltest es versuchen . nach Ende der ETO; Befehl sollten Sie eine Eingabe geben.