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

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

我想做这样的事情:

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

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

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

【问题讨论】:

标签: php variables static double quotes


【解决方案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'
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-27
          • 1970-01-01
          • 2012-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多