Gibt es in PHP eine Möglichkeit, eine Konstante in eine Zeichenfolge aufzunehmen, ohne sie zu verketten?
define('MY_CONSTANT', 42);
echo "This is my constant: MY_CONSTANT";
php
string
constants
concatenation
Brian
quelle
quelle
Antworten:
Nein.
Mit Strings gibt es für PHP keine Möglichkeit, String-Daten von konstanten Bezeichnern zu unterscheiden. Dies gilt für alle Zeichenfolgenformate in PHP, einschließlich Heredoc.
constant()
ist eine alternative Möglichkeit, eine Konstante zu erhalten, aber ein Funktionsaufruf kann auch nicht ohne Verkettung in eine Zeichenfolge eingefügt werden.Handbuch zu Konstanten in PHP
quelle
define('ANIMAL','turtles'); $constant='constant'; echo "I like {$constant('ANIMAL')}";
Ja, das ist es (irgendwie;)):
Dies ist wahrscheinlich nicht das, was Sie angestrebt haben, aber ich denke, technisch gesehen ist dies keine Verkettung, sondern eine Substitution, und von dieser Annahme aus enthält es eine Konstante in einer Zeichenfolge ohne Verkettung .
quelle
Um Konstanten in Zeichenfolgen zu verwenden, können Sie die folgende Methode verwenden:
Wie funktioniert das?
Sie können einen beliebigen String-Funktionsnamen und beliebige Parameter verwenden
Man kann einen beliebigen Funktionsnamen in eine Variable einfügen und ihn mit Parametern in einer Zeichenfolge in doppelten Anführungszeichen aufrufen. Funktioniert auch mit mehreren Parametern.
Produziert
Anonyme Funktionen auch
Sie können auch anonyme Funktionen verwenden, sofern Sie PHP 5.3+ ausführen.
Produziert wie erwartet ordnungsgemäß entkommenes HTML.
Rückruf-Arrays nicht erlaubt!
Wenn Sie jetzt den Eindruck haben, dass der Funktionsname beliebig aufrufbar sein kann, ist dies nicht der Fall, da ein Array, das bei Übergabe an true zurückgibt,
is_callable
bei Verwendung in einer Zeichenfolge einen schwerwiegenden Fehler verursachen würde:Merken Sie sich
Diese Vorgehensweise ist schlecht beraten, führt aber manchmal zu viel besser lesbarem Code. Es liegt also an Ihnen - die Möglichkeit ist vorhanden.
quelle
$_ = create_function('$a','return $a;'); $s = "I like {$_(ANIMAL)}"
. Thetaikos Version macht Zitate überflüssig und ein Unterstrich ist süß.quelle
quelle
Wenn Sie wirklich eine Konstante ohne Verkettung wiedergeben möchten, ist hier die Lösung:
Hinweis : In diesem Beispiel verwendet Echo eine Reihe von Parametern ( siehe Kommas ), sodass es sich nicht um eine echte Verkettung handelt
Echo verhält sich wie eine Funktion, es benötigt mehr Parameter, es ist effizienter als die Verkettung, da es nicht verkettet und dann wiedergegeben werden muss. Es gibt einfach alles wieder, ohne dass ein neues verkettetes String-Objekt erstellt werden muss :))
BEARBEITEN
Auch wenn man bedenkt , verketten Strings, passings Strings als Parameter oder Schreiben ganze Strings mit „The , (Komma - Version) wird immer am schnellsten, nächsten geht . (Verkettung mit ' einfachen Anführungszeichen) und die langsamsten String - Methode Aufbau wird mit doppelten Anführungszeichen “ , weil auf diese Weise geschriebene Ausdrücke gegen deklarierte Variablen und Funktionen ausgewertet werden müssen.
quelle
Du könntest es tun:
quelle
Der einfachste Weg ist
Ein anderer Weg mit
(s)printf
quelle
Wie andere darauf hingewiesen haben, kann man das nicht tun. PHP hat eine Funktion,
constant()
die nicht direkt in einem String aufgerufen werden kann, aber wir können dies leicht umgehen.und ein grundlegendes Beispiel für seine Verwendung:
quelle
$constant = 'constant';
anstatt eine andere Funktion zu definieren, und dies würde identisch funktionieren, da diese Funktion bereits vorhanden ist.Hier sind einige Alternativen zu den anderen Antworten, die sich hauptsächlich auf den Trick "{$}" zu konzentrieren scheinen. Es werden jedoch keine Garantien für ihre Geschwindigkeit gegeben; Das ist alles reiner syntaktischer Zucker. Für diese Beispiele nehmen wir an, dass die folgenden Konstanten definiert wurden.
Verwenden von extract ()
Dies ist hilfreich, da das Ergebnis mit Variablen identisch ist. Zuerst erstellen Sie eine wiederverwendbare Funktion:
Rufen Sie es dann aus einem beliebigen Bereich auf:
Hier werden die Konstanten in Kleinbuchstaben geschrieben, um Ihre Finger zu schonen. Sie können jedoch das array_change_key_case () entfernen, um sie unverändert zu lassen. Wenn Sie bereits widersprüchliche lokale Variablennamen haben, werden diese von den Konstanten nicht überschrieben.
Verwenden der Zeichenfolgenersetzung
Diese Option ähnelt sprintf (), verwendet jedoch ein einzelnes Ersetzungstoken und akzeptiert eine unbegrenzte Anzahl von Argumenten. Ich bin mir sicher, dass es bessere Möglichkeiten gibt, dies zu tun, aber verzeihen Sie meine Unbeholfenheit und versuchen Sie, sich auf die Idee dahinter zu konzentrieren.
Wie zuvor erstellen Sie eine wiederverwendbare Funktion:
Rufen Sie es dann aus einem beliebigen Bereich auf:
Sie können jedes gewünschte Ersatz-Token verwenden, z. B.% oder #. Ich habe den Schrägstrich hier verwendet, da er etwas einfacher zu tippen ist.
quelle
Es macht Spaß, dass Sie das Schlüsselwort 'const' als Namen für Ihre Funktion verwenden können, um Namespace-Abfall zu vermeiden:
Sie können auch $ GLOBALS verwenden, um die Funktion 'const' im gesamten Code zu verbreiten:
Unsicher ist, ob es für die zukünftige Verwendung sicher ist. Und was noch schlimmer ist - es sieht immer noch hässlich aus.
quelle
Ich glaube, dies beantwortet die ursprüngliche Frage des OP. Das einzige ist, dass der globale Indexschlüssel nur in Kleinbuchstaben zu funktionieren scheint.
Ausgabe:
quelle
an associative array containing references to all variables
.$db_user = 'root';