Вопрос

Как я могу заставить 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");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top