将常数(不可变)插入heredoc?

Mic*_*ael 40 php syntax constants heredoc

<?php
   define('my_const', 100);
   echo <<<MYECHO
      <p>The value of my_const is {my_const}.</p>
MYECHO;
?>
Run Code Online (Sandbox Code Playgroud)

如果我在括号内放一个变量就会打印出来.但不是常数.我该怎么做?谢谢!

Luk*_*key 47

我知道这已经得到了回答,但您也可以通过将常量的值赋给变量来解决问题.

我个人这样做,因为如果你的字符串中有很多常量,那么你的sprintf调用可能会非常混乱.然后更难以扫描字符串并查看正在做什么.另外,通过单独分配变量,您可以看到什么是值.

一个例子是:

$const = CONST;
$variable = VARIABLE;
$foo = (new Foo)->setFooProperty(12)->getFooProperty();
$bar = (123 - 456) * 10;
$ten = 1 + 2 + 1 + (5 - 4);
<<<EOD
Lorem ipsum dolor sit amet, **$variable** adipiscing elit. 
Duis gravida aliquet dolor quis gravida. 
Nullam viverra urna a velit laoreet, et ultrices purus condimentum. 
Ut risus tortor, facilisis sed porta eget, semper a augue. 
Sed adipiscing erat non sapien commodo volutpat. 
Vestibulum nec lectus sed elit dictum accumsan vel adipiscing libero. 
**$const** vehicula molestie sapien. 
Ut fermentum quis risus ut pellentesque.
Proin in dignissim erat, eget molestie lorem. Mauris pretium aliquam eleifend.
**$foo** vitae sagittis dolor, quis sollicitudin leo. 
Etiam congue odio sit amet sodales aliquet. 
Etiam elementum auctor tellus, quis pharetra leo congue at. Maecenas sit amet ultricies neque. 
Nulla luctus enim libero, eget elementum tellus suscipit eu. 
Suspendisse tincidunt arcu at arcu molestie, a consequat velit elementum. 
Ut et libero purus. Sed et magna vel elit luctus rhoncus. 
Praesent dapibus consectetur tortor, vel **$bar** mauris ultrices id. 
Mauris pulvinar nulla vitae ligula iaculis ornare. 
Praesent posuere scelerisque ligula, id tincidunt metus sodales congue. 
Curabitur lectus urna, porta sed molestie ut, mollis vitae libero. 
Vivamus vulputate congue **$ten**.
EOD;
Run Code Online (Sandbox Code Playgroud)

  • @FatalError,它是一个旧线程,但我遇到了同样的问题,这个答案比公认的要好,因为您可能在脚本的许多其他地方使用了常量,但在一个特定的地方需要在里面使用它因此,在使用 heredoc 之前,最好将常量转换为变量。 (3认同)
  • 如果我要将值保留在变量中,那么为什么要首先定义常量呢? (2认同)

Sta*_*arx 39

使用sprintf()

define('my_const', 100);
$string = <<< heredoc
      <p>The value of my_const is %s.</p>
heredoc;

$string = sprintf($string, my_const);
Run Code Online (Sandbox Code Playgroud)

  • 此时,我们不妨将常量分配给变量,如下所示 (2认同)

Dom*_*Dom 15

这是一个小技巧,允许双引号字符串和heredocs包含花括号语法中的任意表达式,包括常量和其他函数调用.它使用的事实是函数名称可以赋值给变量,然后在heredoc中调用:

<?php

// Declare a simple function
function _placeholder($val) { return $val; }
// and assign it to something short and sweet
$_ = '_placeholder';

// or optionally for php version >= 5.3
// Use a closure (anomynous function) like so:
$_ = function ($val){return $val;};

// Our test values
define('abc', 'def');
define('ghi', 3);

$a=1;
$b=2;

function add($a, $b) { return $a+$b; }

// Usage
echo "b4 {$_(1+2)} after\n"; // outputs 'b4 3 after'
echo "b4 {$_(abc)} after\n"; // outputs 'b4 def after'
echo "b4 {$_(add($a, $b)+ghi*2)} after\n"; // outputs 'b4 9 after'
$text = <<<MYEND

Now the same in heredoc:
b4 {$_(1+2)} after
b4 {$_(abc)} after
b4 {$_(add($a, $b)+ghi*2)} after

MYEND;
echo $text;
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很棒的技巧.也适用于插入静态类属性. (3认同)

nbo*_*iot 10

您还可以使用get_defined_constants函数.它将所有当前定义的常量放回到数组中,您可以在HEREDOC字符串中使用它

// Let's say there is FOO and BAR defined
$const = get_defined_constants();

$meta = <<< EOF
     my awesome string with "{$const['FOO']}" and "{$const['BAR']}" constants
EOF;
Run Code Online (Sandbox Code Playgroud)

  • 这通常不是一个好主意,因为列表将非常大,因为除了你真正想要的那些之外,它还包括语言核心和扩展中的所有常量.手动将它们分配给局部变量似乎更清晰. (7认同)

Eli*_*las 7

您可以使用“常量”功能。

例如:

    <?php
    define('CONST1', 100);
    define('CONST2', 200);
    $C= 'constant';
    echo <<<MYECHO
          <p>The value of CONST1 is: {$C('CONST1')}, 
              and CONST2 is:{$C('CONST2')}.</p>
    MYECHO;
    ?> 
Run Code Online (Sandbox Code Playgroud)