domingo, 5 de abril de 2015

PHP: Using functions/expressions in HEREDOC strings

PHP: Using functions/expressions in HEREDOC strings

29 Mar2011
If you have any experience with PHP at all, you’ve probably used HEREDOC strings. The syntax is quite useful for long strings that span on multiple lines, but I always disliked the fact that if you wanted to use the result of a function, you need to store it in a variable as an intermediate step:
1
2
3
4
$time = date('r'); // example value: Tue, 29 Mar 2011 17:04:28 +0300
$string = <<<HEREDOC
Now is {$time}
HEREDOC;
Unfortunately, PHP doesn’t provide any direct means for calling functions or outputting expression results in HEREDOC strings. The problem here is that, unless the thing in the curly braces starts with a dollar sign, it can’t be recognized by PHP as something to be replaced – you can’t just put {date(‘r’)}. Functions doesn’t start with a dollar sign, so you can’t use them. Object methods work fine though, because the object variable does start with a “$”.
We can use this behavior in order to devise a very neat workaround to our problem: if PHP wants a $ in the beginning, why don’t we just store the function name in a variable? That’s one of the less popular features of PHP – and for good reasons – but in this particular case it could be very useful. So, we can change our example above to this, and it will work:
1
2
3
4
$date_func = 'date'; // the name of the function as a string
$string = <<<HEREDOC
Now is {$date_func('r')}
HEREDOC;
Now, let’s step this up a bit, shall we? Take a look at this example:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function heredoc($param) {
    // just return whatever has been passed to us
    return $param;
}
 
$heredoc = 'heredoc';
 
$string = <<<HEREDOC
\$heredoc is now a generic function that can be used in all sorts of ways:
Output the result of a function: {$heredoc(date('r'))}
Output the value of a constant: {$heredoc(__FILE__)}
Static methods work just as well: {$heredoc(MyClass::getSomething())}
2 + 2 equals {$heredoc(2+2)}
HEREDOC;
 
// The same works not only with HEREDOC strings,
// but with double-quoted strings as well:
$string = "{$heredoc(2+2)}";
Told you it was neat, isn’t it? :) The “heredoc” function is just a wrapper – it accepts a single argument which is returned unmodified, and the name of this function is stored in a global variable that can be used anywhere in your application. The name of the function and the name of the global variable are completely customizable, so the “heredoc” name is just a suggestion. $heredoc() will be called as a function, and the expression in the parentheses will be evaluated as any other PHP code. The result of that expression will be given to the heredoc function which, in its turn, just returns it and puts it in the HEREDOC string.

http://blog.nazdrave.net/?p=626
 

No hay comentarios:

Publicar un comentario