Let's say my string is:
$str = "abcdefg foo() hijklmopqrst";
How do I let PHP call the function foo() and insert the returning string to the rest of that string?
Let's say my string is:
$str = "abcdefg foo() hijklmopqrst";
How do I let PHP call the function foo() and insert the returning string to the rest of that string?
 
    
     
    
    If you're calling a method of some class, you can use normal variable expansion. For example:
<?php
class thingie {
  public function sayHello() {
    return "hello";
  }
}
$t = new thingie();
echo "thingie says: {$t->sayHello()}";
This will output:
thingie says: hello
Note that the braces around the call are required.
 
    
    Just use this:
$str = "abcdefg".foo()."hijklmnopqrstuvwxyz";
It will call function during string creation.
 
    
    function foo()
{
    return 'Hi';
}
$my_foo = 'foo';
echo "{$my_foo()}";
 
    
    $str="abcdefg foo() hijklmopqrst";
function foo() {return "bar";}
$replaced = preg_replace_callback("~([a-z]+)\(\)~", 
     function ($m){
          return $m[1]();
     }, $str);
output:
$replaced == 'abcdefg bar hijklmopqrst';
This will allow any lower-case letters as function name. If you need any other symbols, add them to the pattern, i.e. [a-zA-Z_].
Be VERY careful which functions you allow to be called. You should at least check if $m[1] contains a whitelisted function to not allow remote code injection attacks.
$allowedFunctions = array("foo", "bar" /*, ...*/);
$replaced = preg_replace_callback("~([a-z]+)\(\)~", 
     function ($m) use ($allowedFunctions) {
          if (!in_array($m[1], $allowedFunctions))
              return $m[0]; // Don't replace and maybe add some errors.
          return $m[1]();
     }, $str);
Testrun on "abcdefg foo() bat() hijklmopqrst" outputs "abcdefg bar bat() hijklmopqrst".
Optimisation for whitelisting approach  (building pattern dynamically from allowed function names, i.e. (foo|bar).
$allowedFunctions = array("foo", "bar");
$replaced = preg_replace_callback("~(".implode("|",$allowedFunctions).")\(\)~", 
     function ($m) {
          return $m[1]();
     }, $str);
 
    
    No. There is no native construct to do exactly that.
A simple concatenation may be better. Maybe uglier but more efficient for the PHP parser.
Well. Yes.
If you really need to get arbitrary expressions being evaluated from a double-quoted string, you can implement this workaround, speculating on a feature called variable-functions:
<?php
/**
 * The hack
 *
 * @param $v mixed Value
 * return mixed Value (untouched)
 */
$GLOBALS['_'] = function ( $v ) {
    return $v;
};
// Happy hacking
echo "Today is {$_( date( 'Y-m-d' ) )} and the max function returns {$_( max( 1, 2, 3 ) )}...{$_( str_repeat( ' arrh', 3 ) )}!";
Result:
Today is 2018-02-07 and the max function returns 3... arrh arrh arrh!
The example is not limited to date(), max() and str_repeat(): you can surely define your own functions like foo() and just call them, as long as they return a valid string.
In short this example creates a simple variable. It has a very short name: just an underscore. So, the variable is really called $_. This variable, to be honest, it's a function and, to be honest, it just returns what you express in the first argument. This is syntax sugar for you, since functions are not easily expanded as-is inside a string. Instead, variables are expanded easily. That's it.
I wonder if PHP will ever introduce a native feature to do that (note: I've written this note in 2018).
Note that, even in this way, the functions are expanded when you define the string. I really cannot guess your needs, but if you need to expand the function later, and not during string definition, you probably need to adopt something more advanced, like a parser. There are many, especially suitable for text templates. But that is outside the scope of this answer I guess.
Feel free to comment / suggest other approaches to expand functions inside a string or just improve your question to share more context about your need.
References:
 
    
    Its still not possible, There are hacks available but not what I would recommend  rather suggest to stick with old school dot operator i.e. $str="abcdefg ". foo() ." hijklmopqrst";
As per the Complex (curly) syntax documentation
Note:
Functions, method calls, static class variables, and class constants inside {$} work since PHP 5. However, the value accessed will be interpreted as the name of a variable in the scope in which the string is defined. Using single curly braces ({}) will not work for accessing the return values of functions or methods or the values of class constants or static class variables.
