variáveis ??estáticas PHP em aspas duplas
Pergunta
Como posso obter PHP para avaliar uma variável estática entre aspas?
Eu quero fazer algo parecido com isto:
log("self::$CLASS $METHOD entering");
Eu tentei todos os tipos de {} combos para obter o valor da variável de self :: $ CLASS, mas nada funcionou. Eu tenho atualmente resolvido com concatenação, mas é uma dor de digitar:
log(self::$CLASS . " $METHOD entering");
Solução
Desculpe, você não pode fazer isso. Ele só funciona para expressões simples. Consulte aqui .
Outras dicas
Infelizmente não há nenhuma maneira de como fazer isso ainda. Exemplo em uma das respostas aqui não vai funcionar, porque {${self::$CLASS}}
não retorna o conteúdo de self::$CLASS
, mas retorna o conteúdo da variável com nome em self::$CLASS
.
Aqui está um exemplo, que não retorna myvar
, mas aaa
:
$myvar = 'aaa';
self::$CLASS = 'myvar';
echo "{${self::$CLASS}}";
Eu não sei a resposta à sua pergunta, mas você pode mostrar o nome da classe e método usando o __METHOD__
magia constante .
Use uma função de identidade anônima armazenado em uma variável. Desta forma, você terá $
imediatamente após {
:
$I = function($v) { return $v; };
$interpolated = "Doing {$I(self::FOO)} with {$I(self::BAR)}";
(estou usando constantes de classe neste exemplo, mas isso vai funcionar com variáveis ??estáticas também).
Apenas ao vivo com a concatenação. Você ficaria surpreso interpolação quão ineficiente variável strings podem ser .
E, enquanto isso poderia cair sob a égide da pré-otimização ou micro-otimização, eu só não acho que você realmente ganhar qualquer elegância neste exemplo.
Pessoalmente, se eu vou fazer uma pequena otimização de um ou outro, e minhas escolhas são "mais rápido" e "mais fácil de digitar" - Eu vou escolher "mais rápido". Porque você só digitá-lo algumas vezes, mas provavelmente vai executar milhares de vezes.
Eu sei que isto é uma questão antiga, mas eu acho estranho que ninguém sugeriu a função [sprintf][1]
ainda.
dizer:
<?php
class Foo {
public static $a = 'apple';
}
você usá-lo com:
echo sprintf( '$a value is %s', Foo::$a );
-lo em seu exemplo, o seu:
log(
sprintf ( ' %s $METHOD entering', self::$CLASS )
);
Sim, isso pode ser feito:
log("{${self::$CLASS}} $METHOD entering");