2009-08-12 21 views
21

Come posso ottenere da PHP la valutazione di una variabile statica tra virgolette doppie?variabili statiche PHP tra virgolette

voglio fare qualcosa di simile:

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

Ho provato tutti i tipi di {} combo per ottenere il valore della variabile di self :: $ classe, ma niente ha funzionato. Ho attualmente risolto con la concatenazione di stringhe, ma è un dolore per digitare:

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

registro (. Self :: $ class "$ METODO entrando"); è un carattere in più da digitare al posto del log ("self :: $ CLASS $ METHOD che digita"); .. questo è un dolore? –

+1

Non è così male, ma l'altro è leggermente più facile da leggere e digitare. :) Mi stavo chiedendo se esistesse un'alternativa se non fossi interessato all'ottimizzazione. – Chris

+4

@Scott: scoraggiamento non è una risposta – cmc

risposta

16

Siamo spiacenti, non è possibile farlo. Funziona solo per espressioni semplici. Vedi here.

+0

"Poiché {non può essere sfuggito, questa sintassi verrà riconosciuta solo quando $ segue immediatamente {." Se ho capito bene, "{self :: $ METHOD}" non funzionerà perché il carattere $ deve seguire direttamente la parentesi graffa sinistra. – Chris

3

non so la risposta alla tua domanda, ma si può mostrare il nome della classe e il metodo con il __METHOD__magic constant.

+0

Grazie. Questo è stato utile. Mi sto spostando da Java e non ho avuto la possibilità di scavare nelle costanti magiche. Userò questi invece di definire le variabili di classe e di metodo. – Chris

1

Basta vivere con la concatenazione. You'd be surprised how inefficient variable interpolation in strings can be.

E anche se questo potrebbe rientrare nell'ottica di pre-ottimizzazione o micro-ottimizzazione, non credo che in questo esempio guadagni eleganza.

Personalmente, se eseguirò una piccola ottimizzazione dell'uno o dell'altro, e le mie scelte saranno "più veloci" e "più facili da scrivere" - scelgo "più velocemente". Perché lo digiti solo poche volte, ma probabilmente lo eseguirò migliaia di volte.

+4

Lo scoraggiamento non è una risposta. – cmc

+1

Sembra che quel permalink sia tutto tranne. –

+2

Questa discussione sull'interpolazione delle stringhe potrebbe non essere ancora vera: secondo Rasmus Lerdorf (tramite Twitter), è un compromesso tra opcode e tmp var, e le prestazioni sono simili. – IMSoP

-1

Sì, questo può essere fatto:

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

Sì, è permesso, ma non raggiunge l'effetto desiderato - tratterà 'self :: $ CLASS' come nome di variabile; quindi se 'self :: $ CLASS == 'foo'' allora finirai con' {$ pippo} ', e non'' pippo'' come potresti aspettarti. –

4

Purtroppo non c'è modo come fare questo ancora. Esempio in una delle risposte qui non funzionerà, perché {${self::$CLASS}} non restituirà il contenuto di self::$CLASS, ma restituirà il contenuto della variabile con nome in self::$CLASS.

Ecco un esempio, che non ritorna, ma myvaraaa:

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