PHP 函数定义中带有 ?> 的文字输出

PHP Literal output with ?> in function definition

在过去编写 PHP 代码时,我经常被不得不在调用 print、echo 或类似代码时嵌套 HTML 代码的尴尬所困扰。通过关闭 PHP 标签并在输出后重新打开它来使部分代码按字面输出的能力可以在一定程度上缓解这种情况,例如:

<?php /*DoSomeStuff*/ ?>
Some HTML code.
<?php /*SomeMorePHP*/ ?>

但是,我一直不清楚它与函数的交互方式。例如,我不清楚是否写:

<?php
function myFunction() {
?>
Some HTML
<?php
}
?>

将生成一个函数,如果该函数将被解析为空但在解析期间输出 HTML,则在调用时将输出 HTML,或者两者都不是,或者如果此构造是完全是非法的?

我不愿意将我的所有结果都基于仅在 PHP 的某个特定实例上进行尝试,因为我不希望相信它有效,而实际上它可能是未定义的行为,或者认为它不起作用我可能只是有一个旧的或有问题的 PHP,而且我从未在任何代码中看到过这种结构。

理想情况下,我正在寻找某种可以澄清这一点的文档或规范参考。

我知道这并不能完全回答你的问题,有很多参考资料,但是:这是有效的(PHP Docs),虽然它看起来不太好,但在一些 但大框架。

你可以试试这个,看看会发生什么:

function htmlOut() {
    ?>
    Some HTML output
    <?php
}


htmlOut();

顺便说一句,我找到了一个示例,MediaWiki 的默认皮肤(我会说他们知道自己在做什么)正在使用您描述的方法。

/**
 * Outputs the entire contents of the (X)HTML page
 */
public function execute() {
    /**
     * some code
     */
    // Output HTML Page
    $this->html( 'headelement' );
    ?>
    <div id="mw-page-base" class="noprint"></div>
    <div id="mw-head-base" class="noprint"></div>
    <div id="content" class="mw-body" role="main">
        <a id="top"></a>

        <?php
    /**
     * some more code
     */
}

在此处查看完整代码:MediaWiki GitHub

基本上它会像您预期的那样工作,这意味着此 HTML 将仅在函数调用时打印。

您的用例可能没有文档,但它类似于条件表达式。

您可以针对以下代码提出类似问题:

<?php if ($expression == true): ?>
  HTML1
<?php else: ?>
  HTML2
<?php endif; ?>

PHP 会打印两个 HTML 部分,还是只打印一个取决于条件? 好吧,文档清楚地说明它按预期工作。 我想我们可以说 functions/methods 是一样的,因为它只是 "a block of code"。它在许多其他情况下使用相同的规则,如循环或 swich

参考:http://php.net/manual/en/language.basic-syntax.phpmode.php示例#1