Frage

In PHP sind die HEREDOC Zeichenfolge Erklärungen wirklich nützlich für einen Block von HTML ausgibt. Sie können es nur in Variablen analysieren haben, indem sie mit $ prefixing, aber für kompliziertere Syntax (wie $ var [2] [3]), müssen Sie Ihren Ausdruck setzen innerhalb {} Klammern.

In PHP 5, es ist möglich, tatsächlich Funktion machen Anrufe innerhalb {} in einer HEREDOC String Zahnspange, aber Sie haben durch ein bisschen Arbeit zu gehen. Der Funktionsname hat sich in einer Variablen gespeichert werden, und Sie haben es zu nennen, wie es ein dynamisch benannte Funktion ist. Zum Beispiel:

$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 mehr chaotisch als nur:

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

Es gibt andere Möglichkeiten neben dem ersten Codebeispiel, wie aus dem HEREDOC brechen die Funktion aufzurufen, oder das Thema Umkehr und tun so etwas 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 der Ausgang direkt in den Ausgabestrom gesetzt wird (es sei denn, ich Ausgabepufferung bin mit), die vielleicht nicht, was ich will.

die Essenz meiner Frage ist also: Gibt es eine elegantere Möglichkeit, diesen Ansatz

Bearbeiten basiert auf Antworten: Es scheint sicher wie eine Art Template-Engine würde mein Leben viel einfacher machen, aber es würde erfordert ich im Grunde meinen üblichen PHP Stil invertieren. wenn auch nicht, dass das ist eine schlechte Sache, aber es erklärt meine Trägheit .. Ich bin bis nach Möglichkeiten, herauszufinden, um das Leben leichter zu machen, so dass ich bin auf der Suche in Vorlagen jetzt.

War es hilfreich?

Lösung

Ich würde nicht HEREDOC verwenden überhaupt für diese persönlich. Es macht nicht nur für eine gute „Schablonenbau“ -System. Alle Ihre HTML wird in einem String gesperrt, die mehrere Nachteile

  • Keine Option für WYSIWYG
  • Keine Code-Vervollständigung für HTML von IDEs
  • Ausgabe (HTML) gesperrt logische Dateien
  • Sie am Ende mit Hacks zu verwenden, wie das, was Sie versuchen, jetzt zu tun komplexere Templat, wie Looping
  • zu erreichen

Hier finden Sie ein grundlegendes Template-Engine, oder einfach nur PHP mit umfasst -. Es ist, warum die Sprache die <?php und ?> Trennzeichen hat

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

Andere Tipps

Wenn Sie wirklich wollen, dies zu tun, aber ein bisschen einfacher als eine Klasse verwenden, können Sie verwenden:

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

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

Ich würde folgendes tun:

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

Nicht sicher, ob Sie würde dies prüfen eleganter sein ...

Versuchen Sie, diese (entweder als globale Variable oder instanziiert, wenn Sie es brauchen):

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

  $fn = new Fn();
?>

Nun kann jeder Funktionsaufruf geht durch die $fn Instanz. So ist die vorhandene Funktion testfunction() in einem heredoc mit {$fn->testfunction()} aufgerufen werden

Im Grunde haben wir alle Funktionen in eine Klasseninstanz wickeln und unter Verwendung von PHP __call magic Methode zur Karte, um die Klassenmethode auf die eigentliche Funktion aufgerufen werden.

Ich bin ein bisschen spät, aber ich über ihn nach dem Zufall kam. Für alle zukünftigen Leser, hier ist was ich wohl tun:

Ich würde nur einen Ausgabepuffer verwenden. Also im Grunde, starten Sie die Pufferung mit ob_start (), dann „Vorlagendatei“ sind mit allen möglichen Funktionen, Variablen etc. im Inneren davon, erhalten Sie den Inhalt des Puffers und schreibt sie in eine Zeichenfolge und dann den Puffer schließen. Dann haben Sie alle Variablen verwendet Sie benötigen, können Sie eine beliebige Funktion ausführen, und Sie haben immer noch die HTML-Syntax in Ihrer IDE verfügbar markieren.

Hier ist, was ich meine:

Template-Datei:

<?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;
?>

So das Skript den template_file.php in seinen Puffer enthält, laufen alle Funktionen / Methoden und Zuweisen alle Variablen auf dem Weg. Dann einfach Sie mit dem Puffer-Inhalt in eine Variable aufzuzeichnen und tun, was man will.

Auf diese Weise, wenn Sie nicht wollen, es auf die Seite rechts auf dieser zweiten Echo, Sie müssen nicht zu. Sie können vor der Ausgabe es Schleife und halten an den String hinzugefügt wird.

Ich denke, das ist der beste Weg zu gehen, wenn Sie eine Template-Engine nicht verwenden möchten.

Der Vollständigkeit halber können Sie auch die !${''} verwenden schwarze Magie Parser Hack :

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

Dieser Code-Schnipsel werden Variablen mit dem Namen Ihrer definierten Funktionen innerhalb userscope definieren und sie in eine Zeichenfolge binden, die den gleichen Namen enthält. Lassen Sie mich zeigen.

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 arbeiten.

Ich denke, heredoc mit zum Erzeugen von HTML-Code ist groß. Zum Beispiel finde ich die folgende fast völlig unleserlich.

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

Um jedoch die Einfachheit zu erreichen, sind Sie gezwungen, um die Funktionen zu bewerten, bevor Sie beginnen. Ich glaube nicht, dass eine solche schreckliche Einschränkung ist, da dabei Sie Ihre Berechnung von der Anzeige am Ende zu trennen, die in der Regel eine gute Idee.

Ich denke, die folgende ist gut lesbar:

$page_content = getPageContent();

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

Leider, obwohl es ein guter Vorschlag, den Sie in Ihrer Frage gestellt war, die Funktion einer Variablen, am Ende zu binden, fügt es ein Maß an Komplexität, um den Code, der es nicht wert ist, und macht den Code weniger lesbar , das ist der große Vorteil von heredoc.

gefunden schöne Lösung mit Umwicklungsfunktion hier: 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)}";

Ich würde einen Blick auf Smarty als Template-Engine - ich habe nicht versucht, andere diejenigen selbst, aber es hat mir gut getan.

Wenn Sie mit Ihrem aktuellen Ansatz bleiben wollen sans Vorlagen, was Ausgabepufferung so schlecht ist? Es wird Ihnen viel mehr Flexibilität, als wenn Variablen zu erklären, die die den Stachel Namen der Funktionen sind die Sie anrufen möchten.

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

Werfen Sie einen Blick in das pHP-Handbuch, Abschnitt "Komplexe (geschweifte) Syntax"

Hier ist 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<br>";

$tab = 'triple';
echo "{$tab(5)} is $tab 5<br>";

Zum Beispiel ist eine gute Verwendung für HEREDOC Syntax große Formen mit Beziehung in einer Datenbank Master-Details erzeugen. Man kann HEREDOC Funktion innerhalb einer FOR-Steuerung, das Hinzufügen eines Suffix nach jedem Feldnamen verwenden. Es ist eine typische Server-Seite Aufgabe.

Sie vergessen, über Lambda-Funktion:

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

Sie können auch die Funktion create_function verwenden

Jungs sollten beachten, dass es funktioniert auch mit Strings in doppelten Anführungszeichen.

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

Interessante Spitze sowieso.

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

Sie sollten es versuchen. nach dem ETO Ende; Befehl sollten Sie eine Eingabe geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top