【问题标题】:Why the class constant value is getting evaluated in one statement and not in other?为什么在一个语句中而不是在另一个语句中评估类常量值?
【发布时间】:2018-12-18 05:32:14
【问题描述】:

我正在使用 PHP 7.2.6

我试过以下程序:

<?php

  class beers {
    const softdrink = 'rootbeer';
  }

  $rootbeer = 'A & W';

  echo "I'd like an {${beers::softdrink}}\n"; //Output : I'd like an A & W

  echo "I'd like an {beers::softdrink}\n"; //Output : I'd like an {beers::softdrink} 

?>

在上述语句中,在第一个 echo 语句中,类常量 softdrink 的值被评估为字符串 'rootbeer',而该字符串又是一个包含字符串 'A 的变量名&W''A & W' 值被打印出来。

在第二个 echo 语句中,我只想显示类常量 softdrink 中的值,即字符串 'rootbeer'

但我做不到。请在这方面帮助我。

附注: 请不要要求我使用字符串连接来实现输出。我只想通过在双引号字符串中使用类常量来实现输出。

【问题讨论】:

  • @MagnusEriksson:我的问题是关于类常量,而您作为重复链接的问题是关于正常常量,所以请删除我问题上的“重复”标记。
  • 类常量和“普通”常量在字符串中的处理方式没有区别,所以重复是非常有效的。
  • 您是否从this question 的答案中获取了这个示例?如果是这样,请阅读接受的答案,它告诉您这是不可能的。

标签: php string class syntax class-constants


【解决方案1】:

Afaik 这是不可能的。字符串中的整个“变量解析”(扩展的卷曲语法)都是基于变量完成的。变量总是以 $ 符号开头,因此不以 $ 开头似乎不起作用。 (即不能使用不是(部分)变量的所有内容。)。

简化示例(不起作用):

const TEST = 'A & W';
echo "I'd like an {TEST}\n";

函数调用也一样(也不能直接工作)

$test = '   A & W   ';
echo "I'd like an {trim($test)}\n";

只有在“sub”花括号中才能使用所需的输出,但必须再次将其解析为变量,这使得它不可能(此时)。

有效:

$AW = 'A & W';
$test = '   AW   ';
echo "I'd like an {${trim($test)}}\n";

编辑:

如果你真的想在一个复杂的花括号表达式中输出一个(类)常量:

class beers {
    const softdrink = 'rootbeer';
}

function foobar($test) {
    $GLOBALS[$test] = $test;
    return $test;
}

echo "I'd like an {${foobar(beers::softdrink)}}\n";

这与我建议的做法相差甚远!!!

【讨论】:

  • 只有当我们在双花括号中使用代码 {${trim($test)}} 时,类常量的值是否在内部评估和使用?
  • 确实如此,但是您必须再次以某种方式将其用作变量。唯一的解决方法是定义一个额外的函数并在 foobar 之外引入丑陋(参见更新的答案)
  • 行 {${foobar(beers::softdrink)}} 应该必须输出 'A & W' 为 $rootbeer = 'A & W';(根据我的代码)
  • 我认为您想要输出 rootbeer 而不是 A & W,否则问题将无关紧要。 (“在第二个 echo 语句中,我只想显示类常量 softdrink 中存在的值,即字符串 'rootbeer'。”)
  • 是的,我想,但我怀疑为什么它没有被再次评估,因为同名的变量也存在?
【解决方案2】:

这样做 -

echo "I'd like an ". beers::softdrink ."\n";

【讨论】:

  • 我猜你错过了问题底部的OP声明:“请不要让我使用字符串连接来实现输出。我只想通过使用来实现输出双引号字符串中的类常量。"
  • 好的..我又回答了!
  • 好的..我又回答了!
【解决方案3】:

你可以用 printf 来做 -

printf("I'd like an %s\n", beers::softdrink);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2016-05-27
    相关资源
    最近更新 更多