【发布时间】:2012-01-18 08:33:21
【问题描述】:
我正在设计自己的 MVC 模式来简化创建主页的过程。我的模板系统需要我的控制器类来输出我的视图。这意味着我必须通过 php 函数输出文件。我已经搜索了一段时间,似乎无法找到解决方案。
如何通过 PHP 函数将表示某些源代码(“”、“”等)的字符串作为 php 运行? eval 不会接受我的
【问题讨论】:
标签: php templates model-view-controller file-io eval
我正在设计自己的 MVC 模式来简化创建主页的过程。我的模板系统需要我的控制器类来输出我的视图。这意味着我必须通过 php 函数输出文件。我已经搜索了一段时间,似乎无法找到解决方案。
如何通过 PHP 函数将表示某些源代码(“”、“”等)的字符串作为 php 运行? eval 不会接受我的
【问题讨论】:
标签: php templates model-view-controller file-io eval
您可以执行 php 代码并像这样收集输出:
ob_start();
include "template.phtml";
$out1 = ob_get_clean();
【讨论】:
$out1 = ob_get_clean();替换最后两行
$this,它就是类的方法。您可以在调用对象的方法时执行相同的操作。如果您对此有疑问,请创建一个新问题以获得帮助。
只是包含()文件应该没问题。我没有深入研究源代码,但我相当确定 Zend Framework 就是这样实现模板的。
【讨论】:
按照 GordonM 的建议,将“echo file_get_contents()”替换为“include()”完全符合需要。还不能投票,因为我太新了,但出于我的需要,这是标题问题的直接答案。
【讨论】:
$code = '<?php
function GetBetween($content, $start, $end) {
$r = explode($start, $content);
if (isset($r[1])){
$r = explode($end, $r[1]);
return $r[0];
}
return '';
}';
function _readphp_eval($code) {
ob_start();
print eval('?>'. $code);
$output = ob_get_contents();
ob_end_clean();
return $output;
}
print _readphp_eval($code);
【讨论】:
嗯,eval 本身并不是废话,如果你不小心你在 eval 中允许的内容,很容易用它创建一个安全漏洞(那个,也许它可能不利于可读性的事实代码)。
至于<? 标志,那是因为eval 需要php 代码,所以如果你不想将php 与普通输出混合,只包括结束?> 标记。
不过,一般来说,您可以以更好的方式实现模板,尝试研究输出缓冲。
【讨论】: