我可以用PHP将include_one文件分配给$var吗


Can I assign an include_once file to a $var with PHP?

我试图推出自己的MVC纯粹是为了学习,但在尝试加载视图文件时遇到了障碍。这是我的问题:

前端控制器抓取合适的页面控制器,页面控制器include_once()抓取合适的视图。该视图是一个包含HTML和PHP的文件。当我从控制器返回包含文件时,包含的文件内容出现在PAGE布局的顺序之外。(例如:我想显示HEADER CONTENT FOOTER,但当我包括视图的内容时,我的控制器会吐出CONTENT,HEADER,1,FOOTER)。

在我的前控制器中,我正在尝试将包含的文件内容设置为一个变量,然后在页面模板中的HEAD和FOOTER之间回显。但这并没有达到预期效果。我可以将视图文件的内容包装在:return"code"中,但我不想担心视图代码中的杂散引号/双引号会破坏脚本。我尝试过file_get_contents(),但它只吐出一个字符串(尽管在我的模板中位于正确的位置/序列),并且没有正确地(即根本)显示我的视图文件中的PHP。

我的问题是:有没有一种方法可以使用变量中的include_once()将视图文件返回到前控制器?我似乎找不到一个充分的答案。如果有帮助的话,我很乐意添加我的代码。

您可以从include()分配返回值。这个函数的一个鲜为人知的功能是,你可以有一个这样的文件:

<?php
// config.php
return array('database_host' => 'localhost');

你可以这样读:

<?php
$config = include('config.php');

然而,你想这样做:

<!-- text.html -->
<h1>Heading</h1>
<p>Hello</p>

并用这个读取:

$html = include('text.html);

您可以尝试这样做,但一旦include()扫描文件,输出就会被发送到web服务器。PHP就是这样工作的。此外,由于没有明确的return值,因此$html变量返回为空。

因此,我们使用输出缓冲函数来修改PHP的行为:我们开始缓冲,然后提取并清除它。然后,这不会发送到Apache,当然,除非您选择关闭输出缓冲和echo您收集的内容,在这种情况下,它会返回到正常的输出缓冲区并实际发送。