In PHP sind die HEREDOC-Zeichenfolgendeklarationen sehr nützlich für die Ausgabe eines HTML-Blocks. Sie können es in Variablen analysieren lassen, indem Sie ihnen $ voranstellen. Für eine kompliziertere Syntax (wie $ var [2] [3]) müssen Sie Ihren Ausdruck jedoch in {} Klammern setzen.
In PHP 5, es ist möglich , Funktionsaufrufe innerhalb von {} Klammern innerhalb einer HEREDOC Zeichenfolge, aber Sie müssen , um tatsächlich durch ein bisschen Arbeit gehen zu machen. Der Funktionsname selbst muss in einer Variablen gespeichert sein, und Sie müssen ihn so aufrufen, als wäre er eine dynamisch benannte Funktion. Beispielsweise:
$fn = 'testfunction';
function testfunction() { return 'ok'; }
$string = <<< heredoc
plain text and now a function: {$fn()}
heredoc;
Wie Sie sehen können, ist dies etwas chaotischer als nur:
$string = <<< heredoc
plain text and now a function: {testfunction()}
heredoc;
Neben dem ersten Codebeispiel gibt es noch andere Möglichkeiten, z. B. das Ausbrechen des HEREDOC zum Aufrufen der Funktion oder das Umkehren des Problems und das Ausführen von Aktionen wie:
?>
<!-- directly output html and only breaking into php for the function -->
plain text and now a function: <?PHP print testfunction(); ?>
Letzteres hat den Nachteil, dass die Ausgabe direkt in den Ausgabestream gestellt wird (es sei denn, ich verwende die 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?
Bearbeiten basierend auf Antworten: Es scheint sicher, dass eine Art Template-Engine mein Leben viel einfacher machen würde, aber ich müsste im Grunde meinen üblichen PHP-Stil umkehren. Nicht, dass das eine schlechte Sache wäre, aber es erklärt meine Trägheit. Ich bin bereit, Wege zu finden, um das Leben einfacher zu machen, also schaue ich mir jetzt Vorlagen an.
Text {$string1} Text {$string2} Text
im Heredoc verwenden.Antworten:
Ich persönlich würde HEREDOC dafür überhaupt nicht verwenden. Es ist einfach kein gutes "Template Building" -System. Ihr gesamtes HTML ist in einer Zeichenfolge gesperrt, die mehrere Nachteile hat
Holen Sie sich eine einfache Template-Engine oder verwenden Sie einfach PHP mit Includes - deshalb hat die Sprache die Trennzeichen
<?php
und?>
.template_file.php
index.php
quelle
<?=$valueToEcho;?>
oder<%=$valueToEcho;%>
abhängig von Ihren INI-Einstellungen.<?=$title?>
ist viel schöner als <? Php echo $ title; ?>. Der Nachteil ist, ja, für die Verteilung haben viele Ini kurze Tags aus. Aber weißt du was? Ab PHP 5.4 sind kurze Tags in PHP unabhängig von den INI-Einstellungen aktiviert! Wenn Sie also mit einer Anforderung von 5.4+ codieren (sagen wir, Sie verwenden zum Beispiel Merkmale), verwenden Sie diese fantastischen kurzen Tags!Wenn Sie dies wirklich tun möchten, aber etwas einfacher als die Verwendung einer Klasse, können Sie Folgendes verwenden:
quelle
$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;};
Ich würde folgendes tun:
Ich bin mir nicht sicher, ob Sie dies für eleganter halten würden ...
quelle
Versuchen Sie dies (entweder als globale Variable oder instanziiert, wenn Sie es benötigen):
Jetzt geht jeder Funktionsaufruf durch die
$fn
Instanz. So kann die vorhandene Funktiontestfunction()
in einem Heredoc mit aufgerufen werden{$fn->testfunction()}
Grundsätzlich packen wir alle Funktionen in eine Klasseninstanz und verwenden die PHP-
__call magic
Methode, um die Klassenmethode der eigentlichen Funktion zuzuordnen, die aufgerufen werden muss.quelle
call_user_func_array
letzten Mal in den Kommentaren auf php.net schlechter ist: php.net/manual/en/function.call-user-func-array.php # 97473Der Vollständigkeit halber können Sie auch den Parser-Hack für
!${''}
schwarze Magie verwenden:quelle
false == ''
. Definieren Sie eine Variable mit einem Namen der Länge 0 (''
). Stellen Sie den gewünschten Wert ein (${''} = date('Y-m-d H:i:s', strtotime('-1 month'))
). Negiere es (!
) und konvertiere es in eine Variable (${false}
).false
muss in einen String konvertiert werden, und(string)false === ''
. Wenn Sie versuchen, einen falschen Wert zu drucken, tritt stattdessen ein Fehler auf. Die folgende Zeichenfolge arbeitet sowohl mit wahrheitsgemäßen als auch mit fälschlichen Werten, auf Kosten der Unlesbarkeit :"${(${''}=date('Y-m-d H:i:s', strtotime('-1 month')))!=${''}}"
.NAN
, verwenden Sie"${(${''} = date('Y-m-d H:i:s', strtotime('-1 month')) )==NAN}"
.Ich bin etwas spät dran, aber ich bin zufällig darauf gestoßen. Für zukünftige Leser würde ich wahrscheinlich 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 allen Funktionen, Variablen usw. hinzu, rufen den Inhalt des Puffers ab, schreiben ihn in eine Zeichenfolge und schließen dann den Puffer. Dann haben Sie alle Variablen verwendet, die Sie benötigen, Sie können jede Funktion ausführen und Sie haben immer noch die HTML-Syntaxhervorhebung in Ihrer IDE verfügbar.
Folgendes meine ich:
Vorlagendatei:
Skript:
Das Skript nimmt also die Datei template_file.php in seinen Puffer auf, führt alle Funktionen / Methoden aus und weist dabei Variablen zu. Dann zeichnen Sie einfach den Inhalt des Puffers in eine Variable auf und machen damit, was Sie wollen.
Auf diese Weise müssen Sie dies nicht tun, wenn Sie es nicht gleich in dieser Sekunde auf der Seite wiedergeben möchten. Sie können die Zeichenfolge wiederholen und weiter ergänzen, bevor Sie sie ausgeben.
Ich denke, das ist der beste Weg, wenn Sie keine Template-Engine verwenden möchten.
quelle
Dieses Snippet definiert Variablen mit dem Namen Ihrer definierten Funktionen in userscope und bindet sie an eine Zeichenfolge, die denselben Namen enthält. Lassen Sie mich demonstrieren.
Wird jetzt funktionieren.
quelle
Ich habe hier eine gute Lösung mit Wrapping-Funktion gefunden: http://blog.nazdrave.net/?p=626
quelle
Ich denke, die Verwendung von Heredoc ist großartig, um HTML-Code zu generieren. Zum Beispiel finde ich das Folgende fast völlig unlesbar.
Um die Einfachheit zu erreichen, müssen Sie jedoch die Funktionen bewerten, bevor Sie beginnen. Ich glaube nicht, dass dies eine so schreckliche Einschränkung ist, da Sie dabei Ihre Berechnung von der Anzeige trennen, was normalerweise eine gute Idee ist.
Ich denke, das Folgende ist gut lesbar:
Obwohl es ein guter Vorschlag war, die Sie in Ihrer Frage gemacht haben, die Funktion an eine Variable zu binden, fügt dies dem Code leider eine Komplexität hinzu, die sich nicht lohnt, und macht den Code weniger lesbar, was bedeutet der große Vorteil von Heredoc.
quelle
Ich würde mir Smarty als Template-Engine ansehen - ich habe selbst keine anderen ausprobiert, aber es hat mir gut getan.
Wenn Sie sich an Ihren aktuellen Ansatz ohne Vorlagen halten möchten , was ist dann so schlecht an der Ausgabepufferung? Sie haben viel mehr Flexibilität, als Variablen deklarieren zu müssen, die die Zeichenfolgennamen der Funktionen sind, die Sie aufrufen möchten.
quelle
Ein bisschen spät aber trotzdem. Dies ist im Heredoc möglich!
Werfen Sie einen Blick in das PHP-Handbuch, Abschnitt "Komplexe (lockige) Syntax"
quelle
Hier ein schönes Beispiel mit dem Vorschlag von @CJDennis:
Eine gute Verwendung der HEREDOC-Syntax besteht beispielsweise darin, große Formulare mit Master-Detail-Beziehung in einer Datenbank zu generieren. Sie können die HEREDOC-Funktion in einem FOR-Steuerelement verwenden und nach jedem Feldnamen ein Suffix hinzufügen. Es ist eine typische serverseitige Aufgabe.
quelle
Sie vergessen die Lambda-Funktion:
Sie können auch die Funktion create_function verwenden
quelle
Jungs sollten beachten, dass es auch mit Zeichenfolgen in doppelten Anführungszeichen funktioniert.
http://www.php.net/manual/en/language.types.string.php
Interessanter Tipp trotzdem.
quelle
quelle
Du solltest es versuchen . nach dem Ende der ETO; Befehl sollten Sie eine Eingabe geben.
quelle
Dies ist heute auf PHP 7.x etwas eleganter
quelle