2009-08-12 14 views
21

Wie bekomme ich PHP, um eine statische Variable in Anführungszeichen zu bewerten?PHP statische Variablen in Anführungszeichen

möchte ich so etwas wie dies zu tun:

log("self::$CLASS $METHOD entering"); 

Ich habe versucht, alle Arten von {} Combos den Variablenwert von self :: $ CLASS zu bekommen, aber nichts hat funktioniert. Ich habe zur Zeit mit String-Verkettung angesiedelt, aber es ist ein Schmerz zu geben:

log(self::$CLASS . " $METHOD entering"); 
+6

log (. Self :: $ CLASS "$ METHODE Eingabe"); ist EIN zusätzliches Zeichen anstelle von log ("self :: $ CLASS $ METHOD-Eingabe"); .. das ist ein Schmerz? –

+1

Es ist nicht so schlimm, aber das andere ist etwas leichter zu lesen und zu tippen. :) Ich habe mich nur gefragt, ob es eine Alternative gibt, wenn Sie nicht mit Optimierung beschäftigt sind. – Chris

+4

@Scott: Entmutigung ist keine Antwort – cmc

Antwort

16

Sorry, das geht nicht. Es funktioniert nur für einfache Ausdrücke. Siehe here.

+0

"Da {kann nicht maskiert werden, wird diese Syntax nur dann erkannt, wenn $ direkt auf {folgt." Wenn ich das richtig verstehe, wird "{self :: $ METHOD}" nicht funktionieren, weil das $ -Zeichen direkt der linken geschweiften Klammer folgen muss. – Chris

3

Ich weiß nicht, die Antwort auf Ihre Frage, aber Sie können die Klassennamen und Verfahren zeigen die __METHOD__magic constant verwenden.

+0

Danke. Das war hilfreich. Ich komme aus Java und habe keine Gelegenheit gehabt, mich in die magischen Konstanten zu vertiefen. Ich werde diese verwenden, anstatt Klassen- und Methodenvariablen zu definieren. – Chris

1

Nur mit der Verkettung leben. You'd be surprised how inefficient variable interpolation in strings can be.

Und während dies unter dem Schirm der Voroptimierung oder Mikrooptimierung fallen könnte, glaube ich nicht, dass Sie tatsächlich in diesem Beispiel Eleganz gewinnen.

Persönlich, wenn ich eine kleine Optimierung der einen oder anderen mache, und meine Entscheidungen sind "schneller" und "einfacher zu tippen" - Ich werde "schneller" wählen. Weil Sie es nur ein paar Mal eingeben, aber es wird wahrscheinlich Tausende Male ausgeführt werden.

+4

Entmutigung ist keine Antwort. – cmc

+1

Sieht so aus, als wäre dieser Permalink alles andere als. –

+2

Die Diskussion der String-Interpolation ist vielleicht noch nicht wahr: Laut Rasmus Lerdorf (via Twitter) ist es ein 1 Opcode vs tmp var-Kompromiss, und die Leistung ist ähnlich. – IMSoP

-1

Ja, das kann getan werden:

log("{${self::$CLASS}} $METHOD entering"); 
+0

Ja, es ist erlaubt, aber es erreicht nicht den gewünschten Effekt - es behandelt 'self :: $ CLASS' als Variablennamen; Also wenn 'self :: $ CLASS == 'foo'', dann wirst du mit' {$ foo} 'und nicht' 'foo'' enden, wie du es vielleicht erwartest. –

4

Leider gibt es keine Möglichkeit, wie dies noch zu tun. Beispiel in einer der Antworten hier wird nicht funktionieren, weil {${self::$CLASS}} Inhalt von self::$CLASS nicht zurückgibt, aber Inhalt der Variablen mit Namen in self::$CLASS zurückgibt.

Hier ist ein Beispiel, das myvar nicht zurückkehrt der Fall ist, aber aaa:

$myvar = 'aaa'; 
self::$CLASS = 'myvar'; 
echo "{${self::$CLASS}}";