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");
Foi útil?

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");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top