我可以使用 PHP 将 include_once 文件分配给 $var 吗?

Posted

技术标签:

【中文标题】我可以使用 PHP 将 include_once 文件分配给 $var 吗?【英文标题】:Can I assign an include_once file to a $var with PHP? 【发布时间】:2015-02-23 16:09:07 【问题描述】:

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

前端控制器抓取适当的页面控制器,页面控制器include_once() 适当的视图。视图是一个包含 htmlphp 的文件。当我从控制器返回包含文件时,包含的文件内容出现与预期的 PAGE 布局顺序不一致。 (例如:我想显示 HEADER CONTENT FOOTER,但是当我包含视图的内容时,我的控制器会吐出 CONTENT, HEADER, 1, FOOTER)。

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

我的问题是:有没有办法可以在变量中使用include_once() 将视图文件返回到前端控制器?我似乎无法找到足够的答案。如果有帮助,我很乐意添加我的代码。

【问题讨论】:

你需要包含你的代码 如果要将包含文件渲染到变量中,可以使用输出缓冲。 Here is a simple template engine 我写了演示如何做到这一点(特别是getRenderedPartial())。如果您希望我在答案中扩展它,请告诉我,但这可能是不言自明的。 也就是说,在很多情况下您不需要输出缓冲,因为您可以在正确的位置使用require()。请参阅renderTemplate() 以使用不会破坏全局空间中的变量的本地提供的变量来执行此操作。 我最终使用了 ob_start() 但很好奇为什么包含该文件不起作用...我不能将包含的文件放入 $VAR 并像使用其他任何文件一样使用它吗$VAR? @halfer 可以!感谢您的建议和帮助! 【参考方案1】:

您可以从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() 扫描文件,输出就会发送到网络服务器。这就是 PHP 的工作原理。由于没有明确的return 值,此外,$html 变量返回为空。

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

【讨论】:

感谢您的解释,我只是想如果我将 include() 分配给 $var,我将能够在我想要的时间/地点使用该 $var,而不是立即吐出被扫描。这是对 include() 函数的逐字记录性质的根本误解。再次感谢您的解释。 没有问题@user1785997,很高兴为您提供帮助。

以上是关于我可以使用 PHP 将 include_once 文件分配给 $var 吗?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 警告:include_once():open_basedir 限制生效

require(),include(),require_once()和include_once()区别

php include_once 使我的代码停止运行

require(),include(),require_once()和include_once()之间的区别

PHP内的包含语句(include(),require(),include_once(),require_once())

require_once 和 include_once 无法正确解析文件