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

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

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

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

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

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

person Chris    schedule 12.08.2009    source источник
comment
log (ввод self :: $ CLASS. $ METHOD); это ОДИН дополнительный символ для ввода вместо журнала (ввод self :: $ CLASS $ METHOD); .. это боль?   -  person Scott Evernden    schedule 12.08.2009
comment
Это не так уж и плохо, но другой немного легче читать и печатать. :) Мне просто интересно, есть ли альтернатива, если вас не волнует оптимизация.   -  person Chris    schedule 12.08.2009
comment
@Scott: Уныние - это не ответ   -  person cmc    schedule 18.07.2011
comment
@cmc это не ответ, это просто ответ.   -  person hobbs    schedule 23.11.2013


Ответы (7)


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

person Electro    schedule 12.08.2009
comment
Поскольку {нельзя экранировать, этот синтаксис будет распознан только тогда, когда $ следует сразу за {. Если я правильно понимаю, {self :: $ METHOD} не будет работать, потому что символ $ должен следовать непосредственно за левой фигурной скобкой. - person Chris; 14.08.2009

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

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

$myvar = 'aaa';
self::$CLASS = 'myvar';
echo "{${self::$CLASS}}";
person micropro.cz    schedule 24.09.2013

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

person Nate    schedule 12.08.2009
comment
Спасибо. Это было полезно. Я перехожу с Java, и у меня не было возможности покопаться в волшебных константах. Я буду использовать их вместо определения переменных класса и метода. - person Chris; 12.08.2009

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

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

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

person Szczepan Hołyszewski    schedule 27.05.2018

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

сказать:

<?php

class Foo {

    public static $a = 'apple';

}

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

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

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

log(
    sprintf ( ' %s $METHOD entering', self::$CLASS )
);
person arvil    schedule 30.09.2018
comment
Хотя я в принципе с вами согласен, OP конкретно спрашивает об интерполяции строк в двойных кавычках. Не sprintf. - person maiorano84; 01.11.2018
comment
@ maiorano84 OP сказал: I've currently settled with string concatenation but it is a pain to type - person arvil; 01.11.2018

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

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

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

person Peter Bailey    schedule 12.08.2009
comment
Уныние - это не ответ. - person cmc; 18.07.2011
comment
Похоже, эта постоянная ссылка совсем не такая. - person ; 21.11.2011
comment
Это обсуждение интерполяции строк все еще может быть неверным: по словам Расмуса Лердорфа (через Twitter), это компромисс между 1 кодом операции и tmp var, и производительность аналогична. - person IMSoP; 13.04.2013
comment
В статье говорится о неэффективности интерполяции. не дает вообще никаких тестов -_- - person ahnbizcad; 15.08.2017

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

log("{${self::$CLASS}} $METHOD entering");
person isaax2    schedule 12.08.2013
comment
Да, это разрешено, но это не дает желаемого эффекта - self::$CLASS будет рассматриваться как имя переменной; так что, если self::$CLASS == 'foo', вы получите {$foo}, а не 'foo', как вы могли бы ожидать. - person Aaron Wallentine; 19.10.2017