引号内的常量不打印?

Yet*_*eti 20 php

这打印苹果:

define("CONSTANT","apple");
echo CONSTANT;
Run Code Online (Sandbox Code Playgroud)

但这不是:

echo "This is a constant: CONSTANT";
Run Code Online (Sandbox Code Playgroud)

为什么?

Art*_*cto 24

因为"不打印引号内的常量".正确的形式是:

echo "This is a constant: " . CONSTANT;
Run Code Online (Sandbox Code Playgroud)

点是连接运算符.

  • 只要有"{$ var}"`,我就希望``{CONSTANT}"`匹配字符串插值语法. (24认同)
  • @AlainTemblo 我也预料到了。Ruby 会做这样的事情:“这是一个 #{CONSTANT}”。我觉得很有趣的是,这里有评论说对常量进行相同类型的解析非常困难或缓慢或不可能或诸如此类......是的,对。 (2认同)

gre*_*jor 19

define('QUICK', 'slow');
define('FOX', 'fox');

$K = 'strval';

echo "The {$K(QUICK)} brown {$K(FOX)} jumps over the lazy dog's {$K(BACK)}.";
Run Code Online (Sandbox Code Playgroud)

  • 如果不明显,间接函数调用技术的一个大问题是$ K不在全局命名空间中,因此必须在每个需要使用它的函数中使用`global $ K;`声明它. (5认同)

jas*_*p85 6

如果要在字符串中包含对变量的引用,则需要使用特殊语法.此功能称为字符串插值,包含在大多数脚本语言中.

此页面描述了PHP中的功能.看起来在PHP中的字符串插值期间不会替换常量,因此获得所需行为的唯一方法是使用Artefacto建议的串联.

事实上,我刚发现另一篇文章说:

AFAIK具有静态变量,其中一个与常数具有相同的"问题":无可能插值,只使用临时变量或连接.

  • 您不能对常量使用特殊语法`{}`的原因很简单:如果```后面紧跟着`$`,括号只被识别为"特殊语法".但常数没有...... (2认同)

Aru*_*nas 6

建议将连接作为此处唯一的解决方案,但在使用以下语法时这不起作用:

    define("MY_CONSTANT", "some information");
    $html = <<< EOS
    <p>Some html, **put MY_CONSTANT here**</p>
EOS;
Run Code Online (Sandbox Code Playgroud)

当然,上面只是将文本“MY_CONSTANT”放入$html中。

其他选项包括:

当然,在如此简单的示例中,没有理由使用 <<< 运算符,但是对于较长的输出块,上述两个可能比一堆字符串连接更清晰且更容易维护!


McS*_*Sim 6

这个问题已经得到解答,但我想对此提供更通用的见解。

在双引号中,PHP 会将任何以 a 开头的内容识别$为要插入的变量。此外,它考虑数组和对象访问([]->),但仅限于单个级别。例如"$foo->bar",插值$foo->bar$foo->bar->baz执行相同的操作,并按->baz字面意思处理字符串。[]此外,对于字符串键,必须省略中的引号。例如,"$foo[bar]"插值$foo['bar']while"$foo['bar']"是一个语法错误。AFAIK,就是这样。要获得更多功能,您需要"{$...}"语法。

这里$实际上是语法的一部分,没有它就无法工作。例如"{FOO}",不会插入常量FOO,这只是一个语法错误。然而,除了一些奇怪的语法限制之外,这个构造实际上相当强大,可以包含任何有效的 PHP 表达式,只要它以 a 开头$并且是数组访问、对象访问或函数调用。(也许其他一些情况是允许的。如果有人对此有更好的理解,请告诉我。)解决您的问题的最通用的解决方案是在代码库中的某个位置定义类似以下函数的内容:

$id = function ($x) {
    return $x;
}
Run Code Online (Sandbox Code Playgroud)

它只是恒等函数——它返回你给它的任何东西。它必须被定义为匿名函数,因此您可以像$id使用$.

现在您可以使用此函数来插入任何 PHP 表达式:

echo "{$id(CONSTANTS)}"
echo "{$id($some + $operators - $as . $well)}"
// etc...
Run Code Online (Sandbox Code Playgroud)

PHP 版本 < 5.3 的替代方案,您不能使用匿名函数:

class Util {
    function id ($x) { return $x; }
}
$u = new Util;
echo "{$u->id(ANY + $expression . $here)}"
// or...
function id ($x) { return $x; };
$id = 'id';
echo "{$id(ANY + $expression . $here)}"
Run Code Online (Sandbox Code Playgroud)