在heredoc语法中是否可以使用PHP函数?

4

在heredoc模板中使用函数而不破坏它是可能的吗?像这样:

<<<HTML
   <div> showcaptcha(); </div>
HTML;

具体来说,我想在这个模板中引用另一个模板,但不使用变量。或者是否有其他更简单的解决方案,而不是使用heredoc?提前感谢。

例如,我正在使用名为requires的类。

class requires {

public function __construct(){
  $this->MYSQL();
  $this->FUNC();
}

public function MAIN_MENU() {
  require_once ('main-menu.tpl');
}

}

那么我在index.php中该做什么?
require_once ('requires.php');
$req = new requires();

echo <<<HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>

//bla bla

</head>
<nav><ul class="fancynav">
{$req->HEAD_SCRIPTS()}
</ul></nav>
HTML;

main-menu.tpl

<li><a href="">Item</a></li>
<li><a href="">Item</a></li>
<li><a href="">Item</a></li>
<li><a href="">Item</a></li>
<li><a href="">Item</a></li>

结果是我得到了一个空字段,没有php错误提示

<nav><ul class="fancynav">



</ul></nav>

什么鬼?


由于“HEAD_SCRIPTS()”方法没有返回任何字符串(而在“HEREDOC”中插入的内容就是该方法的返回值),所以出现了空字段。请使用“return file_get_contents('*.tpl');”代替“require_once()”。 - Xenos
我找到了。所需文档打印在页面底部,而不是我设置变量的位置。 - Евгений Антипов
3个回答

7

是的,您可以使用“encapsed var”技巧:

function hello() {
    global $result;
    $result = 'hi there!';
    return 'result';
}

echo <<<EOF
text ${hello()} text
EOF;

从技术上讲,这样做是可以的,但在生产中最好避免使用此类hack。使用临时变量会更加清晰。


1
“在生产环境中允许这样的黑客攻击是更好的选择。” 如果“echo”位于另一个函数内部,则不要忘记“global $result;”。 - Xenos
谢谢,我明白了。那我最好重新编写所有的模板。 - Евгений Антипов

1

由于您无法直接在 HEREDOC 中调用函数,因此可以将函数名称放入变量中,并在 HEREDOC 字符串内使用该变量:

    $showcaptcha= 'showcaptcha';
    echo
<<<HTML
    <br/> dawg {$showcaptcha()} dawg
HTML;

所以您可以留下当前已编码的函数:
    function showcaptcha()
    {
        return "Gotta captcha mall";
    }

您也可以使用:

    $showcaptcha = function()
    {
        return "Gotta captcha mall";
    }
    echo
<<<HTML
    <br/> dawg {$showcaptcha()} dawg
HTML;

如果要调用的函数与echo在同一级别定义(否则,您将拥有全局变量$showcaptcha)。
如果您有多个函数,可以在heredoc之前进行循环。
    function dawg()
    {
        return "I'm loyal";
    }
    function cat()
    {
        return "I'm cute";
    }
    function fish()
    {
        return "I'm small";
    }
    function elephant()
    {
        return "I'm big";
    }

    $functionsToCall = array('elephant', 'fish', 'cat', 'dawg');
    foreach ($functionsToCall as $functionToCall)
        $$functionToCall = $functionToCall;
    echo
<<<HTML
    <br/> Dawg: {$dawg()}
    <br/> Cat: {$cat()}
    <br/> Fish: {$fish()}
    <br/> Elephant: {$elephant()}
HTML;

那比使用全局变量要好看得多


如果你已经在使用一个临时变量,那么你根本不需要使用封装技巧。只需正常插值即可。 - georg
抱歉,我不太明白...你是什么意思? - Xenos
1
$temp = func(); echo <<<HTML $temp HTML; - georg
哦,是的,但我假设该函数在其他地方设置(因为它没有显示),所以临时变量可以避免在其他地方编辑该代码。 - Xenos
嗯,我决定使用一个包含需要文档的函数列表的类。但是出现了一个模糊的错误。已将代码添加到问题中。 - Евгений Антипов

-2

不,无法在heredoc字符串中使用函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接