Question

How can I get PHP to evaluate a static variable in double quotes?

I want to do something like this:

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

I've tried all sorts of {} combos to get the variable value of self::$CLASS, but nothing has worked. I've currently settled with string concatenation but it is a pain to type:

log(self::$CLASS . " $METHOD entering");
Was it helpful?

Solution

Sorry, you can't do that. It only works for simple expressions. See here.

OTHER TIPS

Unfortunately there is no way how to do this yet. Example in one of answers here will not work, because {${self::$CLASS}} will not returns content of self::$CLASS, but will returns content of variable with name in self::$CLASS.

Here is an example, which does not returns myvar, but aaa:

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

I don’t know the answer to your question, but you can show the class name and method using the __METHOD__ magic constant.

Use an anonymous identity function stored in a variable. This way you will have $ immediately after {:

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

(I am using class constants in this example but this will work with static variables too).

Just live with the concatenation. You'd be surprised how inefficient variable interpolation in strings can be.

And while this could fall under the umbrella of pre-optimization or micro-optimization, I just don't think you actually gain any elegance in this example.

Personally, if I'm gonna make a tiny optimization of one or the other, and my choices are "faster" and "easier to type" - I'm gonna choose "faster". Because you only type it a few times, but it's probably going to execute thousands of times.

I know this is an old question but I find it odd that noone has suggested the [sprintf][1] function yet.

say:

<?php

class Foo {

    public static $a = 'apple';

}

you would use it with:

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

so on your example its:

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

Yes this can be done:

log("{${self::$CLASS}} $METHOD entering");
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top