将常量(非变量)插入“heredoc”

问题描述 投票:0回答:8

考虑:

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

如果我将一个变量放在大括号内,它就会打印出来。但不是常数。我该怎么办?

php syntax constants heredoc
8个回答
62
投票

您还可以通过将常量的值分配给变量来解决该问题。

我个人是这样做的,因为如果你的字符串中有很多常量,那么你的 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;

45
投票

使用 sprintf()

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

$string = sprintf($string, my_const);

22
投票

这里有一个小技巧,允许双引号字符串和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;

13
投票

您可以使用“constant”功能。

例如:

    <?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;
    ?> 

12
投票

您还可以使用 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;

1
投票

将定义的变量放入简单变量中,然后将其包含在heredoc中,如下例所示:

<?php
define('my_const', 100);
$variable = my_const;
   echo <<<MYECHO
      <p>The value of my_const is {$variable}.</p>
MYECHO;
?>

0
投票

我开始喜欢使用看起来像它们所代表的常量的变量名称。因此,举一个更现实的例子:

define('CONST_AUTHOR_FILTER_FIELD',      'authorValue') ;
define('CONST_CB_AUTO_SUBMIT',           'cbAutoSubmit') ;
define('CONST_CB_EXACT_AUTHOR',          'cbAuthorExact') ;
define('CONST_CB_FILTER_AUTHOR',         'cbFilterAuthor') ;

注意:该示例是从一个脚本中提取的,该脚本使用了 HTML 表单上 INPUT 名称的定义常量。

然后,循环:

foreach (get_defined_constants(true)['user') AS $constName => $value)
    if (substr($constName, 0, 6) == 'CONST_')
        $$constName = $value ;

由于上面(已记录的功能)双美元符号($$)的出现,此代码将设置 $CONST_AUTHOR_FILTER_FIELD、$CONST_CB_AUTO_SUBMIT、$CONST_CB_EXACT_AUTHOR 和 $CONST_CB_FILTER_AUTHOR 的值以匹配其常量对应项。如果你有一个定义的常量,如 ('DEFAULT_STATE', 'VA') 那么它将被这段代码忽略(不命名为 CONST_something)。

这样做有巨大的优势,主要是在一致性方面。至少对我来说 - 其他人可能不同意 - 像这样的代码

$myVar = SOME_CONSTANT

(变量名和常量名不同)只会导致编程错误。虽然这肯定不会消除编程错误,但它可以大大减少错误的发生,并且可能更容易发现和纠正。

郑重声明:我更进一步,为我的 JavaScript 制作常量并以类似的方式命名我的 INPUT 项。从相同的代码中提取:

echo <<<EOS
    <!DOCTYPE html>
    <html lang="en">
        <head>
          . . . .
          <style> 
             . . . .
        </style>
        <script>
            const url = '$url' ;

    EOS ;
foreach (get_defined_constants(true)['user'] AS $constant => $value)
    if (substr($constant, 0, 6) == 'CONST_') {
        echo 'const ' . $constant . " = '" . $value . "' ;" . PHP_EOL ;
    }
echo <<<EOS
        </script>
        <script src='$jsFile?modTime=$jsModTime'></script>
    </head>
. . . .
<td><input onclick='authorFilterClicked(this)' type='checkbox' name='$CONST_CB_FILTER_AUTHOR' id='$CONST_CB_FILTER_AUTHOR' $filterAuthorChecked />
   <label for='$CONST_CB_FILTER_AUTHOR'>Filter author</label></td>
<td><input onclick='authorRegExClicked(this)' type='checkbox' name='$CONST_CB_USE_REGEX_AUTHOR' id='$CONST_CB_USE_REGEX_AUTHOR' $authorUseRegExChecked />
   <label for= '$CONST_CB_USE_REGEX_AUTHOR'>Use REGEX</label></td>
<td>Author filter</td>
. . . 

然后,在 JavaCode 中,我可以引用我在 PHP 代码中使用的相同常量名称,并确信它们引用相同的东西。


-1
投票

不是每个人都会喜欢使用简写回显标签,但这仍然是一个选择:

<?php
   define('my_const', 100);
?>
      <p>The value of my_const is <?= my_const ?>.</p>
© www.soinside.com 2019 - 2024. All rights reserved.