考虑:
<?php
define('my_const', 100);
echo <<<MYECHO
<p>The value of my_const is {my_const}.</p>
MYECHO;
?>
如果我把一个变量放在大括号里,它就会被打印出来。但是常量不行。我该怎么做呢?
你也可以通过将常量的值赋给一个变量来解决这个问题。
个人而言,我喜欢这种方式,因为如果你在字符串中有很多常量,那么你的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;
define('my_const', 100);
$string = <<< heredoc
<p>The value of my_const is %s.</p>
heredoc;
$string = sprintf($string, my_const);
%1$d
,则这些参数将无法与heredoc语法一起使用,因为$d
会被视为变量。请在<<<
后面的标签周围加上单引号,以更改为nowdoc语法。 - ThisLeeNoble以下是一种小技巧,允许在双引号字符串和heredoc中使用花括号语法包含任意表达式(包括常量和其他函数调用)。它利用了函数名可以被赋值给变量,然后在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;
<?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;
?>
你也可以使用 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;
<?php
define('my_const', 100);
$variable = my_const;
echo <<<MYECHO
<p>The value of my_const is {$variable}.</p>
MYECHO;
?>
define('CONST_AUTHOR_FILTER_FIELD', 'authorValue') ;
define('CONST_CB_AUTO_SUBMIT', 'cbAutoSubmit') ;
define('CONST_CB_EXACT_AUTHOR', 'cbAuthorExact') ;
define('CONST_CB_FILTER_AUTHOR', 'cbFilterAuthor') ;
foreach (get_defined_constants(true)['user') AS $constName => $value)
if (substr($constName, 0, 6) == 'CONST_')
$$constName = $value ;
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>
. . .
并不是每个人都喜欢使用简写的回显标签,但这仍然是一种选择:
<?php
define('my_const', 100);
?>
<p>The value of my_const is <?= my_const ?>.</p>