Статические переменные PHP в двойных кавычках
Вопрос
Как я могу заставить PHP вычислять статическую переменную в двойных кавычках?
Я хочу сделать что-то вроде этого:
log("self::$CLASS $METHOD entering");
Я перепробовал все виды комбинаций {}, чтобы получить значение переменной self::$CLASS, но ничего не сработало.В настоящее время я разобрался с конкатенацией строк, но вводить текст - это боль:
log(self::$CLASS . " $METHOD entering");
Решение
Извини, ты не можешь этого сделать.Это работает только для простых выражений.Видишь здесь.
Другие советы
К сожалению, пока нет способа, как это сделать.Пример в одном из ответов здесь не сработает, потому что {${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");