【问题标题】:Is that possible to expand function call in PHP string?是否可以在 PHP 字符串中扩展函数调用?
【发布时间】:2010-09-29 14:53:33
【问题描述】:

我尝试在这样的字符串中调用foo()

echo "This is a ${foo()} car";

function foo() {
    return "blue";
}

但是,它最终会出现语法错误。

我找到了 here 类似的东西,但不是我需要的:

echo "This is the value of the var named by the return value of getName(): {${getName()}}";

这样可以吗?

【问题讨论】:

  • 没有一个理由这样做
  • 为什么不呢?我认为以下语法非常有用:"My name is $name, and I'm $age years old"。当然,我也可以这样做:"My name is " . $name . ", and I'm " . $age . " years old",但第一个变体看起来更好。我想知道我是否可以对 get_name()get_age() 函数做同样的事情。
  • 对于变量,这样是可能的,对于函数,这是不可能的。抱歉,我不知道为什么
  • 我不认为它看起来更好。事实上,我认为它看起来更糟,因为它需要您在心理上解析字符串中的变量。此外,它还具有 "I would like to link $foo->$bar" 的含义模糊不清的含义。那应该做什么?字面意思是$foo . '->' . $bar$foo->$bar? $foo . '->$bar'?就是这种模棱两可,我无法忍受。 "foo: $foo" 可能看起来更干净,但我认为它的可读性要差得多恕我直言......

标签: php string


【解决方案1】:

有可能吗?没有。

{$} 中的函数、方法调用、静态类变量和类常量从 PHP 5. 但是,访问的值将被解释为 定义字符串的范围。使用单个花括号 ({}) 不适用于 访问函数或方法的返回值或类常量的值或 静态类变量。

这是http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing.complex 上卷曲语法的第一个注释。

【讨论】:

    【解决方案2】:

    不是那样,不……你可以:

    echo "$(" . foo() . ");";
    

    【讨论】:

      【解决方案3】:

      不,据我所知你只能这样做:

      echo "hello ".foo();
      
      function foo() {
          return "world";
      }
      

      在您的示例中,这将起作用:

      $name = "captaintokyo";
      echo "This is the value of the var named by the return value of getName(): {${getName()}}";
      
      function getName()
      {
          return "name";
      }
      
      // Output:
      // This is the value of the var named by the return value of getName(): captaintokyo
      

      【讨论】:

        【解决方案4】:

        是的,有可能。

        $func = function($param) { return $param; };
        function foo($color) { return "$color car"; }
        
        echo "This is a {$func(foo('blue'))}<br/>";
        
        $title = 'blue car';
        echo "This is a {$func(str_replace('blue', 'red', $title))}<br/>";
        

        $func() 将作为函数调用,括号中的表达式将与任何其他 PHP 代码一样计算。这样你几乎可以直接调用字符串中的任何函数。

        【讨论】:

        • 这是真的好技巧,不确定它有多有用,因为您需要身份关闭
        【解决方案5】:

        你也可以这样做:

        回声 foo();

        【讨论】:

          【解决方案6】:

          $ 括在单引号内,这样它对我来说不是字面意思,并使用连接来附加 foo 的值

          echo '$' . foo();
          
          function foo() {
              return "hello";
          }
          

          打印:$hello

          【讨论】:

            【解决方案7】:

            你给出的例子:

            function foo() {return "hello";}
            echo "${foo()}";
            

            这个例子不起作用,因为使用 PHP 的 {$} 格式的函数只允许您以变量名的形式访问结果,然后显示该变量的内容。

            在您的示例中,echo 语句将尝试回显名为 $hello 的变量的内容。

            要查看它为什么不起作用,我们需要修改示例:

            function foo() {return "hello";}
            $hello="world";
            echo "${foo()}";
            

            该程序将打印world。看来这就是您在给出的第二个示例中找到的内容。

            如果您希望在您的示例中获得一个可以打印hello 的程序,那么您将无法使用这种技术来实现。然而,好消息是有很多更简单的方法可以做到这一点。只需回显函数返回值即可。

            【讨论】:

              【解决方案8】:

              ${} 语法看起来像 shell 命令替换,对于 PHP,你可以使用 eval,http://php.net/eval

              但请注意 eval 是邪恶的...您必须确定自己知道传递给 eval 的内容。

              这样称呼它:

              <?php echo eval("foo();");
              

              【讨论】:

              • 当你的缺陷是我们所说的拥有时,你不应该引用 eval 的缺陷:/
              猜你喜欢
              • 1970-01-01
              • 2012-05-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-05-03
              • 2011-08-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多