56

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?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Michael
  • 4,786
  • 11
  • 45
  • 68
  • possible duplicate of [define and heredoc](http://stackoverflow.com/questions/8242922/define-and-heredoc) – dsnunez Aug 14 '14 at 12:59

7 Answers7

62

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;
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Lukey
  • 922
  • 1
  • 7
  • 9
  • 3
    If I'm going to keep values in variables then why bothered defining constants in the first place? – Rain Mar 01 '18 at 15:04
  • 3
    @FatalError, its an old thread but I ran into same issue and this answer is better than the accepted one because, its possible that you have used the constant at many other places in your script but at one particular place you need to use it inside heredoc hence its better to just convert the constant in variable before you use heredoc. – Abhay Maurya Apr 02 '18 at 08:07
  • this is marginally better than the accepted answer – ddruganov Nov 09 '21 at 05:27
45

Use sprintf()

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

$string = sprintf($string, my_const);
Starx
  • 77,474
  • 47
  • 185
  • 261
  • I had the same problem, and it was my only way. It's the same problem for methods – haltabush Apr 06 '12 at 09:12
  • 1
    @haltabush, You can use function also the same way. – Starx Apr 06 '12 at 09:13
  • 2
    at this point, we might as well assign the constant to a variable, as recommended below – Mirko Pagliai Apr 06 '20 at 12:24
  • Just to note that if you use numbered arguments e.g. `%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 `<<<` – ThisLeeNoble Aug 13 '21 at 08:47
  • This would become too complicated if there's more constants to be used, so I like this answer much more: https://stackoverflow.com/a/65015391/1823945 – gnysek Jan 04 '23 at 22:27
22

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;
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Dom
  • 2,240
  • 16
  • 22
  • 4
    This is a great trick. Also works well for inserting static class properties. – hackel Mar 11 '17 at 01:08
  • 1
    Worked great for passing calculated values into a heredoc containing a JavaScript script. Had a bit of trouble at first because I forgot to put quotes around the string I was passing -- Duh – Stephen R Feb 14 '18 at 21:49
  • Works well and probably faster than the accepted answer – Guesser Jul 16 '19 at 11:48
13

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;
    ?> 
Eliut Islas
  • 588
  • 4
  • 14
11

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;
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
nbonniot
  • 1,034
  • 16
  • 33
  • 14
    This is usually not such a good idea, as the list will be quite large, because it includes all the constants from the language core and extensions in addition to the ones you really want. Manually assigning them to local variables seems cleaner. – FGM Aug 28 '16 at 14:23
1

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;
?>
Sid
  • 4,302
  • 3
  • 26
  • 27
0

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>
Mark
  • 2,380
  • 11
  • 29
  • 49