我试图推出自己的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
您收集的内容,在这种情况下,它会返回到正常的输出缓冲区并实际发送。