PHP static variables in double quotes

2020-01-28 08:55发布

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

7条回答
Emotional °昔
2楼-- · 2020-01-28 09:29

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.

查看更多
虎瘦雄心在
3楼-- · 2020-01-28 09:31

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

查看更多
Emotional °昔
4楼-- · 2020-01-28 09:34

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}}";
查看更多
叼着烟拽天下
5楼-- · 2020-01-28 09:44

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

查看更多
兄弟一词,经得起流年.
6楼-- · 2020-01-28 09:48

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 )
);
查看更多
beautiful°
7楼-- · 2020-01-28 09:50

Yes this can be done:

log("{${self::$CLASS}} $METHOD entering");
查看更多
登录 后发表回答