Domanda

Come posso ottenere PHP per valutare una variabile statica tra virgolette?

Io 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");
È stato utile?

Soluzione

Mi dispiace, non è possibile farlo. Funziona solo per semplici espressioni. Vedere qui .

Altri suggerimenti

Purtroppo non c'è modo come fare questo ancora. Esempio in una delle risposte qui non funziona, perché {${self::$CLASS}} non restituisce il contenuto di self::$CLASS, ma sarà il contenuto di rendimenti variabili con il nome in self::$CLASS.

Ecco un esempio, che non ritorna myvar, ma aaa:

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

Non so la risposta alla tua domanda, ma si può mostrare il nome della classe e il metodo con il __METHOD__ magia costante .

Utilizzare una funzione identità anonima memorizzato in una variabile. In questo modo si avrà $ subito dopo {:

$I = function($v) { return $v; }; $interpolated = "Doing {$I(self::FOO)} with {$I(self::BAR)}";

(sto usando le costanti di classe in questo esempio, ma questo lavorerò con variabili statiche troppo).

Basta vivere con la concatenazione. Sareste sorpresi di quanto inefficiente interpolazione variabile stringhe possono essere .

E mentre questo potrebbe cadere sotto l'ombrello di pre-ottimizzazione o micro-ottimizzazione, io non credo che in realtà ottenere alcun eleganza in questo esempio.

Personalmente, se devo fare una piccola ottimizzazione di uno o l'altro, e le mie scelte sono "più veloce" e "più facile da digitare" - sto andando scegliere "più veloce". Perché solo si digita un paio di volte, ma è probabilmente andando ad eseguire migliaia di volte.

So che questa è una vecchia questione, ma trovo strano che nessuno ha ancora suggerito la funzione [sprintf][1].

dire:

<?php

class Foo {

    public static $a = 'apple';

}

si usa con:

echo sprintf( '$a value is %s', Foo::$a );

così via tuo esempio la sua:

log(
    sprintf ( ' %s $METHOD entering', self::$CLASS )
);

Sì, questo può essere fatto:

log("{${self::$CLASS}} $METHOD entering");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top