PHP static variables in double quotes

Viewed 22044

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");
9 Answers

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

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).

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

<?php

class test {
    public $static = 'text';
    public $self = __CLASS__;
    // static Method
    static function author() {
        return "Frank Glück";
    }
    // static variable
    static $url = 'https://www.dozent.net';
    public function dothis() {
       $self = __CLASS__;
       echo <<<TEST
           
           {${!${''}=static::author()}} // works
           {$self::author()}            // works
           {$this->self::author()}      // works
           ${!${''}=self::author()}     // works
           
           {${$this->self}}::author()}} // don't works
           ${${self::author()}}         // do/don't works but with notice
           ${@${self::author()}}        // works but with @ !
           
TEST;
    }
}

$test = 'test'; // this is the trick, put the Classname into a variable

echo "{$test::author()} {$$test::$url}";
echo <<<HTML
<div>{$test::author()}</div>
<div>{$$test::$url}</div>
HTML;

$test = new test();
$test->dothis();

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 )
);
//define below
function EXPR($v) { return $v; }
$E = EXPR;

//now you can use it in string
echo "hello - three is equal to $E(1+2)";

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.

Related