双引号中的 PHP 静态变量

Posted

技术标签:

【中文标题】双引号中的 PHP 静态变量【英文标题】:PHP static variables in double quotes 【发布时间】:2010-11-19 00:29:42 【问题描述】:

如何让 php 在双引号中计算静态变量?

我想做这样的事情:

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

我尝试了各种 组合来获得self::$CLASS 的变量值,但没有任何效果。我目前已经解决了字符串连接问题,但输入起来很痛苦:

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

【问题讨论】:

log(self::$CLASS . "$METHOD 输入");是要输入一个额外的字符而不是 log("self::$CLASS $METHOD enter"); ..这很痛苦? 还不错,但是另一个更容易阅读和输入。 :) 我只是想知道如果您不关心优化,是否还有其他选择。 @Scott:沮丧不是答案 @cmc 这不是一个答案,它只是 the 答案。 抱歉,您可以这样做。看看我的帖子:http://***.com/questions/8773236/proper-way-to-access-a-static-variable-inside-a-string-with-a-heredoc-syntax/39778415#39778415 【参考方案1】:

对不起,你不能这样做。它只适用于简单的表达式。见here。

【讨论】:

"由于 不能被转义,这种语法只有在 $ 紧跟 时才会被识别。"如果我理解正确,“ self::$METHOD ”将不起作用,因为 $ 字符必须直接跟在左大括号之后。【参考方案2】:

不幸的是,目前还没有办法做到这一点。此处答案之一中的示例将不起作用,因为$self::$CLASS 不会返回self::$CLASS 的内容,但会返回名称为self::$CLASS 的变量的内容。

这里是一个例子,它不返回myvar,而是返回aaa

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

【讨论】:

【参考方案3】:

使用存储在变量中的匿名标识函数。这样你就可以在 之后立即拥有$

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

(我在此示例中使用类常量,但这也适用于静态变量)。

【讨论】:

【参考方案4】:

我不知道你的问题的答案,但是你可以使用__METHOD__magic constant显示类名和方法。

【讨论】:

谢谢。这很有帮助。我从 Java 搬过来,还没有机会深入研究魔法常数。我将使用这些而不是定义类和方法变量。【参考方案5】:

我知道这是一个老问题,但奇怪的是还没有人建议使用 [sprintf][1] 函数。

说:

<?php

class Foo 

    public static $a = 'apple';


你会使用它:

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

以你的例子为例:

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

【讨论】:

虽然我原则上同意你的观点,但 OP 专门询问双引号中的字符串插值。不是sprintf @maiorano84 OP 说:I've currently settled with string concatenation but it is a pain to type【参考方案6】:
<?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();

【讨论】:

【参考方案7】:
//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)";

【讨论】:

【参考方案8】:

只需使用串联即可。 You'd be surprised how inefficient variable interpolation in strings can be.

虽然这可能属于预优化或微优化的范畴,但我认为您在此示例中实际上并没有获得任何优雅。

就个人而言,如果我要对其中一个进行微小的优化,并且我的选择是“更快”和“更容易输入” - 我会选择“更快”。因为你只输入了几次,但它可能会执行数千次。

【讨论】:

沮丧不是答案。 看起来永久链接不是。 关于字符串插值的讨论可能仍然不正确:根据 Rasmus Lerdorf(通过 Twitter),这是 1 opcode 与 tmp var 的权衡,性能相似。 文章声称插值是低效的。不提供任何基准 -_-【参考方案9】:

是的,这可以做到:

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

【讨论】:

是的,是允许的,但是并没有达到预期的效果——它会把self::$CLASS当作变量名;所以如果self::$CLASS == 'foo' 那么你最终会得到$foo,而不是你可能期望的'foo'

以上是关于双引号中的 PHP 静态变量的主要内容,如果未能解决你的问题,请参考以下文章

PHP

PHP双引号的隐患

php中 定义变量为字符串,但字符串中有引号,怎么办?

9.PHP中的静态变量

PHP 面试题 PHP部分

php 笔记 2016/7/5