Статические переменные PHP в двойных кавычках

Как я могу получить PHP для оценки статической переменной в двойных кавычках?

Я хочу сделать что-то вроде этого:

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

Я пробовал все виды {} комбо, чтобы получить переменное значение self::$CLASS, но ничего не сработало. В настоящее время я решил конкатенацию строк, но это боль для ввода:

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

7 ответов


Извините, вы не можете этого сделать. Он работает только для простых выражений. См.здесь.


к сожалению, пока нет способа сделать это. Пример в одном из ответов здесь работать не будет, потому что {${self::$CLASS}} не возвращает контент self::$CLASS, но будет возвращать содержимое переменной с именем в self::$CLASS.

вот пример, который не возвращает myvar, а aaa:

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

Я не знаю ответ на ваш вопрос, но вы можете показать имя класса и метода, с помощью __METHOD__ магической константы.


просто живите с конкатенацией. вы будете удивлены, насколько неэффективной может быть интерполяция переменных в строках.

и хотя это может попасть под зонтик предварительной оптимизации или микро-оптимизации, я просто не думаю, что вы на самом деле получите какую-либо элегантность в этом примере.

лично, если я собираюсь сделать небольшую оптимизацию одного или другого, и мой выбор "быстрее" и "проще" - я выберу "быстрее". Потому что вы только печатаете это несколько раз, но это, вероятно, будет выполняться тысячи раз.


используйте анонимную функцию идентификации, хранящуюся в переменной. Таким образом, у вас будет $ сразу после {:

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

(Я использую константы класса в этом примере, но это будет работать и со статическими переменными).


Я знаю, это старый вопрос, но мне кажется странным, что никто не предложил [sprintf][1] функция еще.

говорят:

<?php

class Foo {

    public static $a = 'apple';

}

вы бы использовали его с:

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

так что на вашем примере:

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

Да это можно сделать:

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