Konditionen in Wertzuweisungen
johny7
- php
Moin allerseits,
ich möchte bei Wertzuweisungen Teile konditional behandeln.
Konkretes Beispiel:
$html = '
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Vorname</th>
<th>Adresse</th>
<th>Aktion</th>
</tr>
</table>
';
Jetzt will ich Aktion abhängig von einer Bedingung einfügen, den Rest aber unabhängig davon.
Meine Idee war folgende Funktion:
function conditional($condition,$value)
{
return ($condition) ? $value : NULL;
}
Mit folgendem Aufruf:
$html = '
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Vorname</th>
<th>Adresse</th>'
.conditional(true,'<th>Aktion</th>').
'</tr>
</table>
';
Ist da so optimal, oder gibt es eine bessere Variante?
Grüße, JN
Hi,
Jetzt will ich Aktion abhängig von einer Bedingung einfügen, den Rest aber unabhängig davon.
Meine Idee war folgende Funktion:
function conditional($condition,$value)
{
return ($condition) ? $value : NULL;
}
Erscheint dir eine Funktion, die nur einen Ausdruck auswerten und das Ergebnis zurückliefern soll, besonders sinnvoll?
(Zumal sie das mit dem Auswerten nicht mal wirklich „selber macht“, sondern das m.E. schon beim Aufruf passieren dürfte.)
Und NULL mit anderen (Text-)Daten per Verkettungsoperator zu verknüpfen, mag zwar das gewünschte liefern, besonder sauber finde ich es aber auch nicht. Du willst entweder einen bestimmten Text zurückliefern, oder keinen Text - und für kein Text fände ich einen Leerstring angebrachter, als NULL.
> Mit folgendem Aufruf:
> ~~~php
> $html = '
> <table>
> <tr>
> <th>ID</th>
> <th>Name</th>
> <th>Vorname</th>
> <th>Adresse</th>'
> .conditional(true,'<th>Aktion</th>').
> '</tr>
> </table>
> ';
>
Ist da so optimal, oder gibt es eine bessere Variante?
In der Funktion erkenne ich da keinen wirklichen Vorteil - da würde ich lieber den Ausdruck direkt einsetzen.
Das wird bei solchen echo-Konstrukten allerdings schnell übersichtlich - bspw. printf/sprintf bieten sich in solchen Fällen als Alternativen an. Mit denen kannst du schon mal den HTML-Code, den du ausgeben willst, von den Daten - und deren dafür notwendiger Behandlung - ein bisschen logisch trennen.
MfG ChrisB
P.S.:
Das wird bei solchen echo-Konstrukten allerdings schnell übersichtlich
Sorry, war ja gar kein echo, sondern eine Wertzuweisung an eine Variable.
Als weitere Alternative zu sprinft bietet sich dann ggf. noch die heredoc-Syntax an, siehe http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc - da muss man die Variablen, die man einsetzen will, dann halt vorher entsprechend belegen.
Und statt das ganze überhaupt in Variablen abzulegen, kann es sich bei längeren Passagen HTML-Code, in denen es nur sehr wenige dyanmische Bestandteile gibt, dann ggf. auch anbieten, den PHP-Bereich zu verlassen. Damit ist man dann auch wieder näher am Prinzip einer Template-Sprache dran - und PHP ist ja eine solche.
MfG ChrisB
Moin allerseits,
Und statt das ganze überhaupt in Variablen abzulegen, kann es sich bei längeren Passagen HTML-Code, in denen es nur sehr wenige dyanmische Bestandteile gibt, dann ggf. auch anbieten, den PHP-Bereich zu verlassen. Damit ist man dann auch wieder näher am Prinzip einer Template-Sprache dran - und PHP ist ja eine solche.
So?
<?php
$html = <<<HTML
?>
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Vorname</th>
<th>Adresse</th>
<?php
($condition) ? <th>Aktion</th> : ''
?>
</tr>
</table>
<?php
HTML;
?>
Oder habe ich etwas nicht korrekt verstanden?
Grüße, JN
Hi,
So?
<?php
$html = <<<HTML
?>
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Vorname</th>
<th>Adresse</th>
<?php
($condition) ? <th>Aktion</th> : ''
?>
</tr>
</table>
<?php
HTML;
?>
> Oder habe ich etwas nicht korrekt verstanden?
Letzteres. Da mischst du jetzt zwei Ansätze - einmal heredoc, und einmal Verlassen des PHP-Bereiches - miteinander.
Das ist so aber nicht sinnvoll.
MfG ChrisB
--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
Moin allerseits,
Hi,
So?
<?php
$html = <<<HTML
?>
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Vorname</th>
<th>Adresse</th>
<?php
($condition) ? <th>Aktion</th> : ''
?>
</tr>
</table>
<?php
HTML;
?>
> > Oder habe ich etwas nicht korrekt verstanden?
>
> Letzteres. Da mischst du jetzt zwei Ansätze - einmal heredoc, und einmal Verlassen des PHP-Bereiches - miteinander.
> Das ist so aber nicht sinnvoll.
Wie dann?
Wie kann ich bei einer Wertzuweiseung den PHP-Bereich verlassen? Und zwischendurch Bedingungen setzen?
Und wozu ist Heredoc dann überhaupt da? Wodurch unterscheidet sich die <<<-Notation von " "?
Grüße, JN
--
ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
http://www.johny7.de
Hi!
Wie kann ich bei einer Wertzuweiseung den PHP-Bereich verlassen? Und zwischendurch Bedingungen setzen?
Die Frage ist, ob überhaupt zwingend eine Wertzuweisung benötigt wird, oder ob man nicht vielleicht das Konzept so umgestaltet, dass man keine Zwischenspeicherung benötigt, sondern während des Ausgabeprozesses (gegen Verarbeitungsende) die (vorher ermittelten) Werte zusammenfügt.
Und wozu ist Heredoc dann überhaupt da? Wodurch unterscheidet sich die <<<-Notation von " "?
Man kann im Heredoc-Block " und ' verwenden, ohne dass sie wie bei mit "" oder '' eingefassten Strings maskiert werden müssen. Sprich in dem Fall: Man kann den Code, den man vielleicht in einem HTML-Editor erstellt hat, direkt ins PHP-Script kopieren, ohne ihn nachbearbeiten zu müssen. Das verbessert letztlich auch die Lesbarkeit.
Lo!
Moin allerseits,
Die Frage ist, ob überhaupt zwingend eine Wertzuweisung benötigt wird, oder ob man nicht vielleicht das Konzept so umgestaltet, dass man keine Zwischenspeicherung benötigt, sondern während des Ausgabeprozesses (gegen Verarbeitungsende) die (vorher ermittelten) Werte zusammenfügt.
Ich verwende ein Affenformular. Im oberen Bereich des Scripts werden die Entscheidungen getroffen, welche Funktionalität gewählt wurde (und welche Ausgaben entsprechend zu tätigen sind); im unteren Bereich geschieht dann die Ausgabe. In den Ausgaben sind sehr viele fixe Formulare. Nur einige Spalten sind optional. Deshalb will ich die Werte erst an eine $html zuweisen (abhängig vom Aufruf) und unten die $html ausgeben.
Geht das dann, so eine Wertzuweisung mit Verlassen des PHP-Bereiches?
Und wozu ist Heredoc dann überhaupt da? Wodurch unterscheidet sich die <<<-Notation von " "?
Man kann im Heredoc-Block " und ' verwenden, ohne dass sie wie bei mit "" oder '' eingefassten Strings maskiert werden müssen. Sprich in dem Fall: Man kann den Code, den man vielleicht in einem HTML-Editor erstellt hat, direkt ins PHP-Script kopieren, ohne ihn nachbearbeiten zu müssen. Das verbessert letztlich auch die Lesbarkeit.
Verstehe.
Grüße, JN
Hi!
Geht das dann, so eine Wertzuweisung mit Verlassen des PHP-Bereiches?
Nein. Denn wenn du in einem String bist, wird kein PHP-Ende-?> erkannt. Du musst erst den String beenden, dann wirkt ein ?> auch wieder. Das heißt, dass du den String zusammenstückeln musst. Bereiche außerhalb von ?> <?php werden (ohne Ausgabepuffer) sofort ausgegeben, eignen sich also auch nicht zur Zuweisung an eine Variable.
Lo!
Moin allerseits,
Hi!
Geht das dann, so eine Wertzuweisung mit Verlassen des PHP-Bereiches?
Nein. Denn wenn du in einem String bist, wird kein PHP-Ende-?> erkannt. Du musst erst den String beenden, dann wirkt ein ?> auch wieder. Das heißt, dass du den String zusammenstückeln musst. Bereiche außerhalb von ?> <?php werden (ohne Ausgabepuffer) sofort ausgegeben, eignen sich also auch nicht zur Zuweisung an eine Variable.
Also bietet sich stattdessen die HEREDOC-Variante an...
Grüße, JN
Mahlzeit johny7,
So?
Wieso nutzt Du nicht die zuerst von ChrisB vorgeschlagene Lösung mittels sprintf()?
$html = sprintf('<table><tr><th>ID</th><th>Name</th><th>Vorname</th><th>Adresse</th>%s</tr></table>', ((true) ? '<th>Aktion</th>' : ''));
MfG,
EKKi
Moin allerseits,
Wieso nutzt Du nicht die zuerst von ChrisB vorgeschlagene Lösung mittels sprintf()?
$html = sprintf('<table><tr><th>ID</th><th>Name</th><th>Vorname</th><th>Adresse</th>%s</tr></table>', ((true) ? '<th>Aktion</th>' : ''));
Keine Ahnung. Einerseits bin ich mit sprintf noch nicht so vertraut, das soll aber nicht das Problem sein. Andererseits Ist mir diese Ausgliederung irgendwie komisch; ich würde das gerne an der Stelle notieren, an der es auch ausgegeben wird, nur eben als konditional kennzeichnen.
Mal sehen, vielleicht steige ich doch noch auf sprintf um.
Grüße, JN
Mahlzeit johny7,
$html = sprintf('<table><tr><th>ID</th><th>Name</th><th>Vorname</th><th>Adresse</th>%s</tr></table>', ((true) ? '<th>Aktion</th>' : ''));
Andererseits Ist mir diese Ausgliederung irgendwie komisch; ich würde das gerne an der Stelle notieren, an der es auch ausgegeben wird,
Hm. Also ich finde es eher unübersichtlich, wenn ich irgendwo eine Code-Stelle finde, der ich zwar ansehen kann, dass sie irgendwas ausgeben soll, dieses Etwas dann aber durch gefühlte tausend Verschachtelungen, Aneinanderstückelungen und Bedingungsgedöns so unübersichtlich ist, dass man nicht auf die Schnelle sehen, was eigentlich genau ausgegeben wird.
Bei sprintf() und seinen Verwandten ist das IMHO eigentlich recht klar: im Prinzip sieht die Ausgabe immer so aus wie der erste Funktionsparameter - nur eben dass bestimmte Platzhalter mit "echten Daten" gefüllt werden.
MfG,
EKKi
Moin allerseits,
Andererseits Ist mir diese Ausgliederung irgendwie komisch; ich würde das gerne an der Stelle notieren, an der es auch ausgegeben wird,
Hm. Also ich finde es eher unübersichtlich, wenn ich irgendwo eine Code-Stelle finde, der ich zwar ansehen kann, dass sie irgendwas ausgeben soll, dieses Etwas dann aber durch gefühlte tausend Verschachtelungen, Aneinanderstückelungen und Bedingungsgedöns so unübersichtlich ist, dass man nicht auf die Schnelle sehen, was eigentlich genau ausgegeben wird.
Gut, wenn die KOnditionen sehr kompliziert werden, dann stimmt das.
Was spricht aber gegen meine anfangs angeführte Funktion?
Grüße, JN
Mahlzeit johny7,
Gut, wenn die KOnditionen sehr kompliziert werden, dann stimmt das.
Was spricht aber gegen meine anfangs angeführte Funktion?
IMHO nichts ... wenn Du sie nicht direkt bei der String-Verkettung verwurstest, sondern stattdessen mit sprintf() arbeitest. So bleibt's insgesamt übersichtlicher.
MfG,
EKKi