Consider:
<?php
define('my_const', 100);
echo <<<MYECHO
<p>The value of my_const is {my_const}.</p>
MYECHO;
?>
If I put a variable inside the braces, it prints out. But not the constant. How can I do it?
Consider:
<?php
define('my_const', 100);
echo <<<MYECHO
<p>The value of my_const is {my_const}.</p>
MYECHO;
?>
If I put a variable inside the braces, it prints out. But not the constant. How can I do it?
Use sprintf()
define('my_const', 100);
$string = <<< heredoc
<p>The value of my_const is %s.</p>
heredoc;
$string = sprintf($string, my_const);
%1$d
, then these won't work with heredoc syntax because the $d
is taken to mean a variable. Change it to nowdoc by putting single quotes around the label after the <<<
–
Nodal You can also approach the problem by assigning the value of the constant to a variable.
Personally I do it that way because if you have lots of constants in your string then your sprintf() call can be quite messy. It's also then harder to scan through the string and see what is doing what. Plus, by assigning the variables individually, you can see what is taking on what value.
An example would be:
$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;
Use sprintf()
define('my_const', 100);
$string = <<< heredoc
<p>The value of my_const is %s.</p>
heredoc;
$string = sprintf($string, my_const);
%1$d
, then these won't work with heredoc syntax because the $d
is taken to mean a variable. Change it to nowdoc by putting single quotes around the label after the <<<
–
Nodal Here is an little trick to allow double-quoted strings and heredocs to contain arbitrary expressions in curly braces syntax, including constants and other function calls. It uses the fact that a function name can be assigned to a variable and then called within 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;
You may use the "constant" function.
for example:
<?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;
?>
You can also use the get_defined_constants function. It puts back all currently defined constants in an array, which you can use in your HEREDOC string:
// 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;
Put your defined variable into simple variable and use include it in heredoc just as in following example:
<?php
define('my_const', 100);
$variable = my_const;
echo <<<MYECHO
<p>The value of my_const is {$variable}.</p>
MYECHO;
?>
I've become fond of using variable names that look like the constants they represent. So, for a more real-world example:
define('CONST_AUTHOR_FILTER_FIELD', 'authorValue') ;
define('CONST_CB_AUTO_SUBMIT', 'cbAutoSubmit') ;
define('CONST_CB_EXACT_AUTHOR', 'cbAuthorExact') ;
define('CONST_CB_FILTER_AUTHOR', 'cbFilterAuthor') ;
Note: The example is extracted from a script that has used defined constants for the INPUT names on an HTML form.
Then, in a loop:
foreach (get_defined_constants(true)['user') AS $constName => $value)
if (substr($constName, 0, 6) == 'CONST_')
$$constName = $value ;
Due to the advent of (documented feature) double-dollarsign ($$) above, this code will set the values of $CONST_AUTHOR_FILTER_FIELD, $CONST_CB_AUTO_SUBMIT, $CONST_CB_EXACT_AUTHOR, and $CONST_CB_FILTER_AUTHOR to match their constant counterparts. if you have a defined constant like ('DEFAULT_STATE', 'VA') then it will be ignored by this code (not named CONST_ something).
There are huge advantages to this, primarily in the area of consistency. For me, at least - others may disagree - code like
$myVar = SOME_CONSTANT
(where the variable names and the constant names are dissimilar) will just lead to programming errors. While this will certainly not eliminate programming errors, it goes far in making them less common, and perhaps easier to spot and correct.
For the record: I go a step further with this, making constants for my JavaScript and naming my INPUT items similarly. Extracted from the same code:
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>
. . .
Then, in the JavaCode, I can refer to the same constant names I used in the PHP code, and know with confidence that they refer to the same thing.
Not everybody will like the use of shorthand echo tags, but this is still an option:
<?php
define('my_const', 100);
?>
<p>The value of my_const is <?= my_const ?>.</p>
© 2022 - 2025 — McMap. All rights reserved.