【问题标题】:Class constant in a string in PHPPHP中字符串中的类常量
【发布时间】:2011-06-13 17:11:33
【问题描述】:

我对@9​​87654321@ 的阅读(就在“字符串访问和按字符修改”部分之前的位)是,您可以在字符串中使用类常量和 {} 做一些花哨的技巧,但您不能这样做让这个方法返回真相的简单事情:

class c {
    const k = '12';
    public function s() {
        return "Twelve in decimal is {c::k}.";
    }
}

这里是连接的正确解决方案吗?

【问题讨论】:

  • 既然串联工作,为什么你只是串联?
  • @evolve:问题是关于 PHP 语言,而不是关于什么是好的代码。为什么我会或不会连接(如果我有选择的话)是无关紧要的。
  • 如果有人想知道你为什么不想连接;您可能使用的是 heredoc 字符串而不是双引号字符串。两者都扩展变量,但 heredocs 不能很好地连接。

标签: php string


【解决方案1】:

这里是连接的正确解决方案吗?

是的。扩展的 curly 语法不支持它。

或者,您可以将常量列表导出到数组并使用它(或将常量导出到单个标量变量名称),但这并不是 IMO 真正的好解决方案。

注意常量是可用的,你可以这样做:

const k = 'foo';
$foo = 'bar';
echo "{${c::k}}"

给你bar,但这不是你想要的。

【讨论】:

    【解决方案2】:

    这有点神秘,但手册中有关于此的说明。

    自 PHP 5 起,{$} 内的函数、方法调用、静态类变量和类常量都可以使用。但是,访问的值将被解释为定义字符串的范围内的变量名。使用单个花括号 ({}) 将无法访问函数或方法的返回值或类常量或静态类变量的值。

    最后一句话告诉你它不会起作用,所以是的,连接是这里的方法


    (已修改)以上段落的示例:

    <?php
    class beers {
        const softdrink = 'rootbeer';
    }
    
    $rootbeer = 'A & W';
    
    // This works; outputs: I'd like an A & W
    echo "I'd like an {${beers::softdrink}}\n";
    
    // This won't work; outputs: I'd like an {beers::softdrink}
    echo "I'd like an {beers::softdrink}\n";
    

    【讨论】:

    • 这正是我在 OP 中引用的手册的一部分,这让我有点困惑。但我认为我们同意这意味着什么。
    【解决方案3】:

    curly 语法仅适用于“变量表达式”。您需要任何可以通过 {$ 访问的内容。

    哦,只有那个解决方法:

        $c = "constant";
        return "Twelve in decimal is {$c('c::k')}.";
    

    这显然比在这里使用字符串连接更短或更易读。

    【讨论】:

      猜你喜欢
      • 2011-11-10
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 2012-09-19
      相关资源
      最近更新 更多